Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Bom Dia Galera,
Estou com um formulário que eu adiciono itens a uma listview( Um Item em cada Linha) e quando eu clico em salvar deveria salvar todos Itens no banco de dados SQL Server. Se Existir somente um Item ele Salva normalmente,porém se houverem mais de um Item Aparece a mensagem ("O nome da Variável já foi declarado, os nomes de variáveis devem ser exclusivos ..."). Como Faço para fazer com a variavel mude de acordo com as linhas do LIstView se for isso mesmo que deve ser feito ?
Segue Abaixo o codigo até o momento.
----------------------------------------------------------------------------------------------------------------------
Function SalvarItens()
Dim sqlCon As New SqlConnection(StrCon)
Dim sqlCmd As New SqlCommand
Try
sqlCon.Open()
With sqlCmd
.CommandType = CommandType.Text
.CommandText = ""
For Each item As ListViewItem In FrmOrcamentos.ListComprar.Items
.CommandText = "INSERT INTO Orcamentos (OrcNum,CodProd,DescProd,Quantidade) VALUES (@OrcNum,@CodProd,@DescProd,@Quantidade)"
.Connection = sqlCon
.Parameters.Add(New SqlParameter("@OrcNum", SqlDbType.NVarChar)).Value = FrmOrcamentos.LblNumOrc.Text
.Parameters.Add(New SqlParameter("@CodProd", SqlDbType.NVarChar)).Value = FrmOrcamentos.ListComprar.Items(0).Text
.Parameters.Add(New SqlParameter("@DescProd", SqlDbType.NVarChar)).Value = FrmOrcamentos.ListComprar.Items(0).SubItems(1).Text
.Parameters.Add(New SqlParameter("@Quantidade", SqlDbType.NVarChar)).Value = FrmOrcamentos.ListComprar.Items(0).SubItems(3).Text
Next
End With
sqlCmd.ExecuteNonQuery()
MsgBox("Item Cadastrado com Sucesso.", MsgBoxStyle.Information)
Catch ex As Exception
MsgBox(ex.Message)
Finally
sqlCmd.Parameters.Clear()
sqlCon.Close()
End Try
Return True
End Function
--------------------------------------------------------------------------------------------------------------------------------
SE PUDEREM ME AJUDAR EU AGRADEÇO, ENQUANTO ISSO VOU QUEBRANDO A CABEÇA AQUI ...
*** RESPEITO E ATITUDE ***
Meu Caro KhaosDoctor,
mudei o "For each" para o "for" comum, porém aparece a mesma mensagem de erro:
" O nome da Variavel "OrcNUm" já foi declarado,os nomes de variáveis devem ser exclusivos
em um lote de consulta ou em um procedimento armazenado"
essa mensagem só aparece se no meu listview tiver dois itens (duas Linhas)
se tiver só um Item (uma Linha) salva corretamente.
Como se eu tivesse que declarar uma variavel para cada linha do listview.( o Problema é que eu não sei como faze-lo, se esse for o caso )
Abraço...
Isso também não vale a pena, criar uma variável por linha. Tente usar na query, ao invés de parâmetros o String.Format:
.CommandText = String.Format("INSERT INTO Orcamentos (OrcNum,CodProd,DescProd,Quantidade) VALUES ({0},{1},'{2}',{3})", valor0, valor1, valor2, valor3)
E delete os parâmetros do SQL
Meu Caro KhaosDoctor, Obrigado pela dica de utilizar o string.format,não aparece nenhuma mensagem de erro, Porém ele salva somente o que está na primeira linha do ListView , cada linha se refere a um produto diferente com (CodigodoProduto, DescricaodoProduto, Quantidade)
segue abaixo como esta o codigo do botão "Salvar"
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Private Sub BtSalvar_Click(sender As System.Object, e As System.EventArgs) Handles BtSalvar.Click
Dim sqlCon As New SqlConnection(Conexao.Conexao)
Dim sqlCmd As New SqlCommand
Try
sqlCon.Open()
With sqlCmd
.CommandType = CommandType.Text
.CommandText = ""
For Each item As ListViewItem In ListComprar.Items
.CommandText = String.Format("INSERT INTO Orcamentos (OrcNum,CodProd,DescProd,Quantidade) VALUES ({0},{1},'{2}',{3})", LblNumOrc.Text, ListComprar.Items(0).Text, ListComprar.Items(0).SubItems(1).Text, ListComprar.Items(0).SubItems(3).Text)
.Connection = sqlCon
Next
End With
sqlCmd.ExecuteNonQuery()
MsgBox("Registro Inserido com Sucesso.", MsgBoxStyle.Information)
Catch ex As Exception
MsgBox(ex.Message)
Finally
sqlCmd.Parameters.Clear()
sqlCon.Close()
End Try
End SubE ele está salvando só a primeira linha? Basta mudar os valores do format para as outras linhas.
não sei se eu estou pensando errado, mas e se o usuário inserir muitos itens vão existir muitas linhas no listview,eu não teria que colocar uma forma de salvar todas as linhas independente da quantidade que o usuário adicione?
Desculpe a ignorância, sou novato em programação.
Sim, é por isso que estamos usando o Format, você atribui variáveis para os mais diversos itens da sua listview, e essas variáveis vão mudar de item para item, por isso o for passa por todos os itens pegando o index do contador e adicionando na lista.
Bom Dia KhaosDoctor,
Segui todas suas dicas mas não consegui, ainda continua inserindo somente 1 linha no banco de dados.
Poste seu código aqui
Private Sub BtSalvar_Click(sender As System.Object, e As System.EventArgs) Handles BtSalvar.Click
Dim sqlCon As New SqlConnection(Conexao.Conexao)
Dim sqlCmd As New SqlCommand
Try
sqlCon.Open()
With sqlCmd
.CommandType = CommandType.Text
.CommandText = ""
For i As Integer = 0 To ListComprar.Items.Count - 1
.CommandText = String.Format("INSERT INTO Orcamentos (OrcNum,CodProd,DescProd,Quantidade) VALUES ({0},{1},'{2}',{3})", LblNumOrc.Text, ListComprar.Items(i).Text, ListComprar.Items(i).SubItems(1).Text, ListComprar.Items(i).SubItems(3).Text)
.Connection = sqlCon
Next
End With
sqlCmd.ExecuteNonQuery()
MsgBox("Itens Cadastrados com Sucesso.", MsgBoxStyle.Information)
Catch ex As Exception
MsgBox(ex.Message)
Finally
sqlCmd.Parameters.Clear()
sqlCon.Close()
End Try
End Sub
Salva somente o ultimo Item Da "listView"
Estou fazendo alguma coisa errada ???
Boa Noite KhaosDoctor,acontece
Consegui resolver o problema, acontece que
Private Sub BtSalvar_Click(sender As System.Object, e As System.EventArgs) Handles BtSalvar.Click
Dim sqlCon As New SqlConnection(Conexao.Conexao)
Dim sqlCmd As New SqlCommand
Try
sqlCon.Open()
With sqlCmd
.CommandType = CommandType.Text
.CommandText = ""
For i As Integer = 0 To ListComprar.Items.Count - 1
.CommandText = String.Format("INSERT INTO Orcamentos (OrcNum,CodProd,DescProd,Quantidade) VALUES ({0},{1},'{2}',{3})", LblNumOrc.Text, ListComprar.Items(i).Text, ListComprar.Items(i).SubItems(1).Text, ListComprar.Items(i).SubItems(3).Text)
.Connection = sqlCon
sqlCmd.ExecuteNonQuery()
Next
End With
MsgBox("Itens Cadastrados com Sucesso.", MsgBoxStyle.Information)
Catch ex As Exception
MsgBox(ex.Message)
Finally
sqlCmd.Parameters.Clear()
sqlCon.Close()
End Try
End Sub
No Código Acima, o "sqlCmd.ExecuteNonQuery()" estava fora do "Next"
Então só era salvo uma linha, foi só colocar ele dentro do "Next" que deu certo
Muito Obrigado pela ajuda e pela atenção atenção.
Ao invés de usar o For each você poderia usar o for comum:
For i As Integer = 0 To ListComprar.Items.Count - 1