none
Gravar parcelas do datagrid no banco sqlite RRS feed

  • Pergunta

  • Boa noite!

    tenho um projeto no banco acces e recentemente troquei para o banco sqlite, mas o método salvar não funciona da erro.

     private void salvar_parcela()
            {
                var conn = Conexao.Conex();
                SQLiteCommand cmd = new SQLiteCommand(@"INSERT INTO parcelas (idparcela, idcontrole, num_parcela, datavenc, valor_parc ) VALUES (@idparcela, @idcontrole, @num_parcela, @datavenc, @valor_parc)", conn);
    
                int posicao = 0;
                //*********************
                foreach (DataGridViewRow linha in dataGridParcelas.Rows)
                {
                    posicao = linha.Index;
                    string cod_parcela = dataGridParcelas.Rows[posicao].Cells[0].Value.ToString();
                    Int32 parcela = Convert.ToInt32(cod_parcela);
    
                    string cod_controle = dataGridParcelas.Rows[posicao].Cells[1].Value.ToString();
                    Int32 controle = Convert.ToInt32(cod_controle);
    
                    string num_parcela = dataGridParcelas.Rows[posicao].Cells[2].Value.ToString();
                    Int32 numroparcela = Convert.ToInt32(num_parcela);
    
                    string preço = dataGridParcelas.Rows[posicao].Cells[4].Value.ToString();
                    preço = preço.Replace("R", "");
                    preço = preço.Replace("$", "");
                    preço = preço.Replace(" ", "");
                    preço = preço.Replace(".", "");
    
                    System.Globalization.DateTimeFormatInfo vencimento = new System.Globalization.DateTimeFormatInfo();
                    vencimento.ShortDatePattern = "dd/MM/yyyy";
                    DateTime Data = Convert.ToDateTime(dataGridParcelas.Rows[posicao].Cells[3].Value.ToString(), vencimento);
                               
    
                    cmd.Parameters.AddWithValue("@idparcela", parcela);
                    cmd.Parameters.AddWithValue("@idcontrole", controle);
                    cmd.Parameters.AddWithValue("@num_parc", numroparcela);
                    cmd.Parameters.AddWithValue("@datavenc", Data);
                    cmd.Parameters.AddWithValue("@valor_parc", Convert.ToDecimal(preço));
                    conn.Open();
                    cmd.ExecuteNonQuery();
                    conn.Close();              
                    MessageBox.Show("Gravado com sucesso !", "Informação!", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
               
               
            }

    segunda-feira, 25 de abril de 2016 02:45

Respostas

  • Você tem que incrementar o idparcela para não violar a FK. Marque como resposta se foi útil o post anterior
    • Marcado como Resposta Marcos SJ segunda-feira, 25 de abril de 2016 16:57
    segunda-feira, 25 de abril de 2016 16:25
  • Boa tarde,

    Concordo com a Poliana, se seu atributo 'idparcela' for chave primaria "primary key", vai precisar incrementar. Se for fazer isso uma única vez vai da certo apenas incrementando. Senão você vai ter que fazer uma consulta que te retorne o maior "idparcela" ou seja "select max(idparcela from parcelas)" após isso incrementar.

    Vale ressaltar que existe outras maneiras de fazer isso.

    Att,


    Se a resposta contribuiu com seu aprendizado por favor marque como util, se solucionou seu problema marque como resposta.

    • Marcado como Resposta Marcos SJ segunda-feira, 25 de abril de 2016 16:57
    segunda-feira, 25 de abril de 2016 16:46

Todas as Respostas

  • Boa noite,

    Não testei seu código ainda, mas notei que você adiciona o "SQLiteCommand" fora do laço "foreach". Tente colocar dentro do laço.
    Ou seja a cada 'volta' no laço crie uma nova instância do SQLiteCommand. 

    Att,


    Se a resposta contribuiu com seu aprendizado por favor marque como util, se solucionou seu problema marque como resposta.

    segunda-feira, 25 de abril de 2016 03:01
  • Bom dia Silvaney!

    Fiz conforme você me indicou mas continua dando erro.

    private void salvar_parcela()
            {
                var conn = Conexao.Conex();
                int posicao = 0;
                //*********************
                foreach (DataGridViewRow linha in dataGridParcelas.Rows)
                {
                    SQLiteCommand cmd = new SQLiteCommand("INSERT INTO parcelas (idparcela, idcontrole, num_parcela, datavenc, valor_parc ) VALUES (@idparcela, @idcontrole, @num_parcela, @datavenc, @valor_parc)", conn);
                    conn.Open();
    
                    posicao = linha.Index;
                    
                    string cod_parcela = linha.Cells[0].Value.ToString();
                    Int32 parcela = Convert.ToInt32(cod_parcela);
    
                    string cod_controle = linha.Cells[1].Value.ToString();
                    Int32 controle = Convert.ToInt32(cod_controle);
                   
                    string num_parcela = linha.Cells[2].Value.ToString();
                    Int32 numroparcela = Convert.ToInt32(num_parcela);
    
                   
                    string preço = linha.Cells[4].Value.ToString();
                    preço = preço.Replace("R", "");
                    preço = preço.Replace("$", "");
                    preço = preço.Replace(" ", "");
                    preço = preço.Replace(".", "");
    
                    System.Globalization.DateTimeFormatInfo vencimento = new System.Globalization.DateTimeFormatInfo();
                    vencimento.ShortDatePattern = "dd/MM/yyyy";
                    DateTime Data = Convert.ToDateTime(dataGridParcelas.Rows[0].Cells[3].Value.ToString(), vencimento);
                    string strPreco = linha.Cells[4].Value.ToString();
    
                    cmd.Parameters.AddWithValue("@idparcela", parcela);
                    cmd.Parameters.AddWithValue("@idcontrole", controle);
                    cmd.Parameters.AddWithValue("@num_parc", numroparcela);
                    cmd.Parameters.AddWithValue("@datavenc", Data);
                    cmd.Parameters.AddWithValue("@valor_parc", Convert.ToDecimal(preço));
                    
                    cmd.ExecuteNonQuery();
                    conn.Close();              
                    MessageBox.Show("Gravado com sucesso !", "Informação!", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }

    Esta dando o mesmo erro.

    segunda-feira, 25 de abril de 2016 10:52
  • Tambem fiz assim;

     private void salvar_parcela()
            {
                var conn = Conexao.Conex();
                int posicao = 0;
                //*********************
                foreach (DataGridViewRow linha in dataGridParcelas.Rows)
                {                
                    conn.Open();
                    SQLiteCommand cmd = new SQLiteCommand("INSERT INTO parcelas (idparcela, idcontrole, num_parcela, datavenc, valor_parc ) VALUES (@idparcela, @idcontrole, @num_parcela, @datavenc, @valor_parc)", conn);
                    posicao = linha.Index;
                    
                    string cod_parcela = linha.Cells[0].Value.ToString();
                    Int32 parcela = Convert.ToInt32(cod_parcela);
    
                    string cod_controle = linha.Cells[1].Value.ToString();
                    Int32 controle = Convert.ToInt32(cod_controle);
                   
                    string num_parcela = linha.Cells[2].Value.ToString();
                    Int32 numroparcela = Convert.ToInt32(num_parcela);
    
                   
                    string preço = linha.Cells[4].Value.ToString();
                    preço = preço.Replace("R", "");
                    preço = preço.Replace("$", "");
                    preço = preço.Replace(" ", "");
                    preço = preço.Replace(".", "");
    
                    System.Globalization.DateTimeFormatInfo vencimento = new System.Globalization.DateTimeFormatInfo();
                    vencimento.ShortDatePattern = "dd/MM/yyyy";
                    DateTime Data = Convert.ToDateTime(dataGridParcelas.Rows[0].Cells[3].Value.ToString(), vencimento);
                    string strPreco = linha.Cells[4].Value.ToString();
    
                    cmd.Parameters.AddWithValue("@idparcela", parcela);
                    cmd.Parameters.AddWithValue("@idcontrole", controle);
                    cmd.Parameters.AddWithValue("@num_parc", numroparcela);
                    cmd.Parameters.AddWithValue("@datavenc", Data);
                    cmd.Parameters.AddWithValue("@valor_parc", Convert.ToDecimal(preço));
                    
                    cmd.ExecuteNonQuery();
                    conn.Close();              
                    MessageBox.Show("Gravado com sucesso !", "Informação!", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }          
               
            }

    Mas não funcionou

    segunda-feira, 25 de abril de 2016 10:53
  • Bom dia, seu comando de INSERT tem um parâmetro chamado @num_parcela e você está adicionando um campo com nome diferente, veja:

    cmd.Parameters.AddWithValue("@num_parc", numroparcela);

    Substitui para o nome do parâmetro correto e testa novamente.



    • Sugerido como Resposta Poliana Dias segunda-feira, 25 de abril de 2016 18:31
    segunda-feira, 25 de abril de 2016 12:21
  • Continua dado erro mas agora é outro veja.

    segunda-feira, 25 de abril de 2016 16:03
  • Se na grid tiver so um registro salva sem erros,

    mas se tiver mais de dois registros da erro.

    segunda-feira, 25 de abril de 2016 16:06
  • Você tem que incrementar o idparcela para não violar a FK. Marque como resposta se foi útil o post anterior
    • Marcado como Resposta Marcos SJ segunda-feira, 25 de abril de 2016 16:57
    segunda-feira, 25 de abril de 2016 16:25
  • Boa tarde,

    Concordo com a Poliana, se seu atributo 'idparcela' for chave primaria "primary key", vai precisar incrementar. Se for fazer isso uma única vez vai da certo apenas incrementando. Senão você vai ter que fazer uma consulta que te retorne o maior "idparcela" ou seja "select max(idparcela from parcelas)" após isso incrementar.

    Vale ressaltar que existe outras maneiras de fazer isso.

    Att,


    Se a resposta contribuiu com seu aprendizado por favor marque como util, se solucionou seu problema marque como resposta.

    • Marcado como Resposta Marcos SJ segunda-feira, 25 de abril de 2016 16:57
    segunda-feira, 25 de abril de 2016 16:46
  • Obrigado Poliana realmente faltava incrementar o campo idparcela fiz um método e funcionou perfeitamente, segue o código pra que outras pessoas possam utilizar.

               foreach (DataGridViewRow linha in dataGridParcelas.Rows)
                {
                    conn.Open();
                    SQLiteCommand cmd = new SQLiteCommand("INSERT INTO parcelas (idparcela, idcontrole, num_parcela, datavenc, valor_parc ) VALUES (@idparcela, @idcontrole, @num_parcela, @datavenc, @valor_parc)", conn);
                    posicao = linha.Index;
    
                    string cod_parcela = linha.Cells[0].Value.ToString();
                    string cod_controle = linha.Cells[1].Value.ToString();
                    string num_parcela = linha.Cells[2].Value.ToString();
                    string preço = linha.Cells[4].Value.ToString();
                    string data = linha.Cells[3].Value.ToString();//Nova implmentação
    
                    Int32 parcela = Convert.ToInt32(cod_parcela);
                    Int32 controle = Convert.ToInt32(cod_controle);
                    Int32 numroparcela = Convert.ToInt32(num_parcela);
                    DateTime Data = Convert.ToDateTime(data);//Nova implementação
    
                    parcela = Convert.ToInt32(RetornaCodigoContaMaisUm(QueryParcela).ToString());// Nova implemntação
                   
                    preço = preço.Replace("R", "").Replace("$", "").Replace(" ", "").Replace(".", "");
    
                    cmd.Parameters.AddWithValue("@idparcela", parcela);
                    cmd.Parameters.AddWithValue("@idcontrole", controle);
                    cmd.Parameters.AddWithValue("@num_parcela", numroparcela);
                    cmd.Parameters.AddWithValue("@datavenc", Data);
                    cmd.Parameters.AddWithValue("@valor_parc", Convert.ToDecimal(preço));
    
                    cmd.ExecuteNonQuery();
                    conn.Close();                
                }
                MessageBox.Show("Gravado com sucesso !", "Informação!", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }

    segunda-feira, 25 de abril de 2016 20:37