none
onde neste código existe uma conexão aberta? SQLite - Database Locked !!! RRS feed

  • Pergunta

  • Não consigo achar onde há uma conexão aberta nesse código. Eu crio o banco de dados do zero e ele adiciona uma registro perfeitamente. A partir do segundo, quando vou inserir os dados, aparece a exceção de database locked. Não entendo onde está o erro. Ajudem-me por favor:

      private void button1_Click(object sender, EventArgs e)
            {
    
                const string filename = @"F:\Programação\Banco de Dados\Geral.db";
                string query = "INSERT INTO ATALHO (Nome, Texto) VALUES (@Nome, @Texto)";
                // var conecta = new SQLiteConnection("Data Source=" + filename + ";Version=3;") ;
                // DataSet ds = new DataSet();
    
                using (SQLiteConnection c = new SQLiteConnection("Data Source=" + filename + ";Version=3;"))
                {
    
                    c.Open();
    
    
                    using (SQLiteCommand createCommand = new SQLiteCommand(query, c))
                    {
                        createCommand.Parameters.AddWithValue("Nome", txt_Entrada.Text);
                        createCommand.Parameters.AddWithValue("Texto", rtb_Saida.Rtf);
    
                      //  SQLiteDataReader dr = createCommand.ExecuteReader();
                         createCommand.ExecuteNonQuery();
                        
                         
                    }
                  
                    
                        c.Close();
                   
    
    
                        ConectarDB();
    
              
                    MessageBox.Show("Atalho Adicionado com Sucesso!");
    
    
                }
    
            }

    terça-feira, 6 de fevereiro de 2018 17:10

Respostas

  • Bom, o problema estava no método ConectarDB no evento FormLoad. Não sei por que já que no método a conexão ao banco de dados era aberta e depois fechada. Obrigado a quem ajudou!!
    • Marcado como Resposta Denis Valjean quinta-feira, 8 de fevereiro de 2018 11:57
    quinta-feira, 8 de fevereiro de 2018 11:57

Todas as Respostas

  • Denis Valjean, boa tarde!

    Onde que está dando erro, no "ExecuteNonQuery()"?

    Poderia postar o código do método ConectarDB() ?

    Bem provável que seu metodo ConectarDB, está abrindo uma outra conexão.

    att.

    Felipe

    terça-feira, 6 de fevereiro de 2018 19:08
  • Denis Valjean, boa tarde!

    Onde que está dando erro, no "ExecuteNonQuery()"?

    Poderia postar o código do método ConectarDB() ?

    Bem provável que seu metodo ConectarDB, está abrindo uma outra conexão.

    att.

    Felipe

    Olá Felipe, o erro está na linha: 

    createCommand.ExecuteNonQuery();

    Abaixo o método que pediu:

    void ConectarDB()
            {
    
                const string filename = @"F:\Programação\Banco de Dados\Geral.db";
                const string query = "select * from ATALHO;";
                var conecta = new SQLiteConnection("Data Source=" + filename + ";Version=3;");
    
                try
                {
    
                    DataSet ds = new DataSet();
                    conecta.Open();
                    var da = new SQLiteDataAdapter(query, conecta);
                    da.Fill(ds);
    
                    listaDados.DataSource = ds.Tables[0].DefaultView;
    
    
                    SQLiteCommand createCommand = new SQLiteCommand(query, conecta);
                    SQLiteDataReader dr = createCommand.ExecuteReader();
    
                    conecta.Close();
                    conecta.Dispose();
                }
    
                catch (Exception)
                {
                    throw;
                }
    eu fecho a conexão, não entendo pq só acontece depois da primeira inserção de registro no bando de dados.
    terça-feira, 6 de fevereiro de 2018 19:44
  • Denis, bom dia!

    Coloque um "try catch" no seu ExecuteNonQuery, e veja a mensagem que vai gerar.

    try
                        {
                            createCommand.ExecuteNonQuery();
                        }
                        catch (Exception ex)
                        {
                            string msg = ex.Message;
                        }

    Fiz um teste aqui, e funcionou normalmente.

    Sua tabela "ATALHO" está criada?

    att.

    Felipe


    quarta-feira, 7 de fevereiro de 2018 10:14
  • Bom dia 

    Tente fazer desta forma

    public gravaAlgo()
    
    {
        SqlConnection con;
    
        try
        {
           con.Open();
        }
        catch(Exception ex)
        {
    
        }
    
        finally
        {
          con.Close();
        }
    }


    Att Joao
    quarta-feira, 7 de fevereiro de 2018 11:37
  • parece que achei onde está o problema, vou copiar o código todo abaixo pra facilitar. Eu chamo o método ConectarDB logo no início do Form1 Load para carregar o datagridview...se eu remover o ConectarDB do início o database locked some, mas aí o datagridview não atualiza após cada inserção. ainda preciso de ajuda pra entender:
    public partial class Form1 : Form
        {
    
            private LowLevelKeyboardListener _listener;  //field escutar keyboardda Classe Low Level Keyboard Listener.
    
    
    
            public Form1()
            {
                InitializeComponent();
    
            }
    
    
    
            private void Form1_Load(object sender, EventArgs e)
            {
    
    
               ConectarDB()  //parece que o problema está aqui!!!!!!!!!!!!!!!!!!!!
    
    
    
                listaDados.Columns[2].Visible = false;
    
                if (listaDados.SelectedRows.Count > 0) // make sure user select at least 1 row 
                {
    
    
                    try
                    {
                        this.listaDados.Rows[0].Cells[2].Value = rtb_Saida.Rtf;
    
    
                    }
                    catch (Exception)
                    {
    
    
                    }
    
    
                    txt_Entrada.Text = listaDados.SelectedRows[0].Cells[1].Value.ToString();
                    rtb_Saida.Rtf = listaDados.SelectedRows[0].Cells[2].Value.ToString();
    
    
                }
                //------------------Repeti o CellContentClick aqui para já carergar o pirmeiro item - verificar depois
    
    
    
                
            }
    
    
    
            string txtPesquisa; //Variável que vai armazenar a expressão de atalho.
    
    
     void ConectarDB()
            {
    
                const string filename = @"F:\Programação\Banco de Dados\Geral.db";
                const string query = "select * from ATALHO;";
                var conecta = new SQLiteConnection("Data Source=" + filename + ";Version=3;");
    
                try
                {
    
                    DataSet ds = new DataSet();
                    conecta.Open();
                    var da = new SQLiteDataAdapter(query, conecta);
                    da.Fill(ds);
    
                    listaDados.DataSource = ds.Tables[0].DefaultView;
    
    
                    SQLiteCommand createCommand = new SQLiteCommand(query, conecta);
                    SQLiteDataReader dr = createCommand.ExecuteReader();
    
                    conecta.Close();
                 
                }
    
                catch (Exception)
                {
                    throw;
                }
    
            }//====================
    
      private void button1_Click(object sender, EventArgs e)
            {
    
                const string filename = @"F:\Programação\Banco de Dados\Geral.db";
                string query = "INSERT INTO ATALHO (Nome, Texto) VALUES (@Nome, @Texto)";
                // var conecta = new SQLiteConnection("Data Source=" + filename + ";Version=3;") ;
                // DataSet ds = new DataSet();
    
                using (SQLiteConnection c = new SQLiteConnection("Data Source=" + filename + ";Version=3;"))
                {
    
                    c.Open();
    
    
                    using (SQLiteCommand createCommand = new SQLiteCommand(query, c))
                    {
    
    
                       
                        createCommand.Parameters.AddWithValue("Nome", txt_Entrada.Text);
                        createCommand.Parameters.AddWithValue("Texto", rtb_Saida.Rtf);
    
                        //  SQLiteDataReader dr = createCommand.ExecuteReader();
                        createCommand.ExecuteNonQuery();
                       
    
                    }
    
                  c.Close();
    
                    
    
                   Conectar DB()
    
                    MessageBox.Show(" Adicionado com Sucesso!");
    
    
    
    
                }
            }
    

    quarta-feira, 7 de fevereiro de 2018 12:22
  • Bom, o problema estava no método ConectarDB no evento FormLoad. Não sei por que já que no método a conexão ao banco de dados era aberta e depois fechada. Obrigado a quem ajudou!!
    • Marcado como Resposta Denis Valjean quinta-feira, 8 de fevereiro de 2018 11:57
    quinta-feira, 8 de fevereiro de 2018 11:57