none
Inserir um listview no banco de dados RRS feed

  • Pergunta

  • Estou tentando inserir uma listview no banco de dados, ele faz o foreach de todas as linhas, mas na hora de inserir, não insere. Já tentei de todas as formas, mas o máximo que consegui chegar foi ele inserindo o último.

    Alguém pode me ajudar?

            private void Bt_Cadastrar_Click(object sender, EventArgs e)
            {
                if (!VerificaCampos())
                    return;
    
                Remessa oNota = new Remessa();
                foreach (ListViewItem item in lvlListagemRemessa.Items)
                {
                    Remessa oNotaRemessa = new Remessa();
                    oNotaRemessa.FuncionarioID = Convert.ToInt32(txt_CodigoFuncionario.Text.Trim());
                    oNotaRemessa.NotaID = Convert.ToInt32(item.SubItems[0].Text);
                    oNotaRemessa.NumeroNota = item.SubItems[2].Text;
                    oNotaRemessa.DataSaida = DateTime.Now;
                    oNotaRemessa.UsuarioID = Sessao.Usuario.Codigo;
                    oNotaRemessa.DataAlteracao = DateTime.Now;
                }
                
                RemessaNG ngNotaRemessa = new RemessaNG();
    
                //Grava no banco pela primeira vez
                if (ngNotaRemessa.Inserir(oNota))
                {
                    MessageBox.Show("Nota cadastrada com sucesso!", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information);
                    LimparCampos();
                }
                else
                    MessageBox.Show("Não foi possivel cadastrar a nota. Tente novamente!", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

    quinta-feira, 24 de outubro de 2019 18:15

Respostas

  • Boa tarde raraborges123,

    Verificando seu trecho de código, notei alguns pontos que acredito que devem ser melhorados.

     - Primeiro é criado um objeto Remessa oNota, fora do foreach, e esse objeto só é usado novamente no método Inserir. Dessa forma, o ele é passado sem nenhum valor, pois está sendo criado e já salvando.

     - Dentro do for, é criado, um objeto oNotaRemessa, que é preenchido, mas não é feito nada com ele, a cada iteração do for, ele é instanciado novamente, e os atributos são perdidos.

     - Você disse que o máximo que chegou foi salvando o último, certo? Então o seu método Inserir(...) está funcionando. Esse método inserir deve estar dentro do foreach, para que a cada objeto carregado, seja salvo no banco de dados. E além disso, você salvou o último mas aparentemente foi sem nenhuma informação pois o objeto oNotaRemessa, onde você preenche os valores não é o mesmo passado como parâmetro no método Inserir.

    Fiz algumas alterações que podem ajudar. Talvez seja necessário adaptar mais alguma coisa, mas o código abaixo pode ser uma base.

    private void Bt_Cadastrar_Click(object sender, EventArgs e)
            {
                if (!VerificaCampos())
                    return;
    
                RemessaNG ngNotaRemessa = new RemessaNG();
                bool erro = false;
    
                foreach (ListViewItem item in lvlListagemRemessa.Items)
                {
                    Remessa oNotaRemessa = new Remessa();
                    oNotaRemessa.FuncionarioID = Convert.ToInt32(txt_CodigoFuncionario.Text.Trim());
                    oNotaRemessa.NotaID = Convert.ToInt32(item.SubItems[0].Text);
                    oNotaRemessa.NumeroNota = item.SubItems[2].Text;
                    oNotaRemessa.DataSaida = DateTime.Now;
                    oNotaRemessa.UsuarioID = Sessao.Usuario.Codigo;
                    oNotaRemessa.DataAlteracao = DateTime.Now;
    
                    try
                    {
                        ngNotaRemessa.Inserir(oNotaRemessa);
                    }
                    catch (Exception)
                    {
                        erro = true;
                        MessageBox.Show("Não foi possivel cadastrar a nota" + oNotaRemessa.NumeroNota + ". Tente novamente!", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
    
                }
    
                if (!erro)
                    MessageBox.Show("Notas cadastradas com sucesso!", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information);
                LimparCampos();
                    
            }


    Espero ter ajudado.



    • Editado João Otávio A quinta-feira, 24 de outubro de 2019 20:00 Alteração no código fonte
    • Marcado como Resposta IgorFKModerator sexta-feira, 25 de outubro de 2019 13:10
    quinta-feira, 24 de outubro de 2019 19:44

Todas as Respostas

  • Boa tarde raraborges123,

    Verificando seu trecho de código, notei alguns pontos que acredito que devem ser melhorados.

     - Primeiro é criado um objeto Remessa oNota, fora do foreach, e esse objeto só é usado novamente no método Inserir. Dessa forma, o ele é passado sem nenhum valor, pois está sendo criado e já salvando.

     - Dentro do for, é criado, um objeto oNotaRemessa, que é preenchido, mas não é feito nada com ele, a cada iteração do for, ele é instanciado novamente, e os atributos são perdidos.

     - Você disse que o máximo que chegou foi salvando o último, certo? Então o seu método Inserir(...) está funcionando. Esse método inserir deve estar dentro do foreach, para que a cada objeto carregado, seja salvo no banco de dados. E além disso, você salvou o último mas aparentemente foi sem nenhuma informação pois o objeto oNotaRemessa, onde você preenche os valores não é o mesmo passado como parâmetro no método Inserir.

    Fiz algumas alterações que podem ajudar. Talvez seja necessário adaptar mais alguma coisa, mas o código abaixo pode ser uma base.

    private void Bt_Cadastrar_Click(object sender, EventArgs e)
            {
                if (!VerificaCampos())
                    return;
    
                RemessaNG ngNotaRemessa = new RemessaNG();
                bool erro = false;
    
                foreach (ListViewItem item in lvlListagemRemessa.Items)
                {
                    Remessa oNotaRemessa = new Remessa();
                    oNotaRemessa.FuncionarioID = Convert.ToInt32(txt_CodigoFuncionario.Text.Trim());
                    oNotaRemessa.NotaID = Convert.ToInt32(item.SubItems[0].Text);
                    oNotaRemessa.NumeroNota = item.SubItems[2].Text;
                    oNotaRemessa.DataSaida = DateTime.Now;
                    oNotaRemessa.UsuarioID = Sessao.Usuario.Codigo;
                    oNotaRemessa.DataAlteracao = DateTime.Now;
    
                    try
                    {
                        ngNotaRemessa.Inserir(oNotaRemessa);
                    }
                    catch (Exception)
                    {
                        erro = true;
                        MessageBox.Show("Não foi possivel cadastrar a nota" + oNotaRemessa.NumeroNota + ". Tente novamente!", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
    
                }
    
                if (!erro)
                    MessageBox.Show("Notas cadastradas com sucesso!", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information);
                LimparCampos();
                    
            }


    Espero ter ajudado.



    • Editado João Otávio A quinta-feira, 24 de outubro de 2019 20:00 Alteração no código fonte
    • Marcado como Resposta IgorFKModerator sexta-feira, 25 de outubro de 2019 13:10
    quinta-feira, 24 de outubro de 2019 19:44
  • João Otávio, muito obrigada! Seu código funcionou perfeitamente! 
    sexta-feira, 25 de outubro de 2019 00:18