Usuário com melhor resposta
Inserir um listview no banco de dados

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); }
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
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
-