ERRO AO SALVAR DADOS DE GRIDVIEW EM BANCO ACCESS
Amigos, já fiz algumas tentativas para conseguir salvar os dados de um DataGridView em banco access, mas todas sem sucesso, acontece que o Grid é carregado a partir de algumas informação passadas pelos usuário, basicamente 3 colunas (N° do documento, Valor do documento e Data de Pagamento). Ae que mora o problema, acredito que tenho que fazer um laço para ler todas as informações do grid e salvar na minha tabela, mas não estou conseguindo, segue o código:
Alguma sugestão??
Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
Using con As OleDbConnection = GetConnection()
Try
con.Open()
Dim sql As String = [Ô]INSERT INTO Cond_Pagamentos (Documento, Data, Valor) VALUES (?,?,?)[Ô]
Dim cmd As OleDbCommand = New OleDbCommand(sql, con)
cmd.Parameters.AddWithValue([Ô]@Documento[Ô], DocumentoDoGrid.ToString)
cmd.Parameters.AddWithValue([Ô]@Data,[Ô], DataNoGrid.ToString)
cmd.Parameters.AddWithValue([Ô]@Valor,[Ô], ValorNoGrid.ToString)
cmd.ExecuteNonQuery()
MsgBox([Ô]Grid Salvo.[Ô], MsgBoxStyle.Information)
con.Close()
Catch ex As Exception
MessageBox.Show(ex.Message)
Finally
con.Close()
End Try
End Using
End Sub
Alguma sugestão??
Retirei o Finally do seu código porque como você está utilizando o Using para abrir a conexao, ela fechará quando sair no End Using. O con.Close dentro do Try também é desnecessário.
Esse código apenas está inserinado um único registro. Tente assim:
Esse código apenas está inserinado um único registro. Tente assim:
Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
Using con As OleDbConnection = GetConnection()
Try
Dim sql As String = [Ô]INSERT INTO Cond_Pagamentos (Documento, Data, Valor) VALUES (@Documento, @Data, @Valor)[Ô]
Dim cmd As OleDbCommand = New OleDbCommand(sql, con)
cmd.Parameters.AddWithValue([Ô]@Documento[Ô], DocumentoDoGrid.ToString)
cmd.Parameters.AddWithValue([Ô]@Data[Ô] , DataNoGrid.ToString)
cmd.Parameters.AddWithValue([Ô]@Valor[Ô] , ValorNoGrid.ToString)
con.Open()
cmd.ExecuteNonQuery()
MsgBox([Ô]Grid Salvo.[Ô], MsgBoxStyle.Information)
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Using
End Sub
Tentei aqui, mas não consegui chegar no resultado esperado, na minha tabela foi salvo a seguinte informação: DataGridViewTextBoxColumn { Name=DocumentoDoGrid, Index=0 }[Ô] e não o valor da célula do grid, como também salvou um único registro.
Anexei a imagem do Gridview para você entender melhor!
Anexei a imagem do Gridview para você entender melhor!
Pelo que parece, você não está passando corretamente os dados do grid para a sql. Procure usar o debug e veja que dados estão sendo passados.
Uma forma de capturar os dados da grid é assim: Grid.rows(indice).cells(indice).Value
Qualquer coisa, poste aÃ.
Uma forma de capturar os dados da grid é assim: Grid.rows(indice).cells(indice).Value
Qualquer coisa, poste aÃ.
Essa função que está utilizando só irá inserir um único registro no BD. Para você salvar todos os dados do grid, terá que se percorrer todos os registros, e passar um a um para ele
Então, pensando nisso fiz umas alterações aqui, consegui salvar, mas somente um registro, estou com um problema no [Ô]for[Ô] agora, segue:
Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
Using con As OleDbConnection = GetConnection()
Try
Dim sql As String = [Ô]INSERT INTO Cond_Pagamentos (Documento, Data, Valor) VALUES (@Documento, @Data, @Valor)[Ô]
Dim cmd As OleDbCommand = New OleDbCommand(sql, con)
For i As Integer = 0 To DataGridView1.Rows.Count - 1
cmd.Parameters.Add([Ô]@Documento[Ô], OleDbType.VarChar).Value = DataGridView1.Rows.Item(i).Cells(0).Value.ToString
cmd.Parameters.Add([Ô]@Data[Ô], OleDbType.VarChar).Value = DataGridView1.Rows.Item(i).Cells(1).Value.ToString
cmd.Parameters.Add([Ô]@Valor[Ô], OleDbType.VarChar).Value = DataGridView1.Rows.Item(i).Cells(2).Value.ToString
Next i
con.Open()
cmd.ExecuteNonQuery()
MsgBox([Ô]Grid Salvo.[Ô], MsgBoxStyle.Information)
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Using
End Sub
Tente assim:
Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
Using con As OleDbConnection = GetConnection()
Try
Dim sql As String = [Ô]INSERT INTO Cond_Pagamentos (Documento, Data, Valor) VALUES (@Documento, @Data, @Valor)[Ô]
Dim cmd As OleDbCommand = New OleDbCommand(sql, con)
con.Open()
For i As Integer = 0 To DataGridView1.Rows.Count - 1
cmd.Parameters.Clear()
cmd.Parameters.Add([Ô]@Documento[Ô], OleDbType.VarChar).Value = DataGridView1.Rows.Item(i).Cells(0).Value.ToString
cmd.Parameters.Add([Ô]@Data[Ô], OleDbType.VarChar).Value = DataGridView1.Rows.Item(i).Cells(1).Value.ToString
cmd.Parameters.Add([Ô]@Valor[Ô], OleDbType.VarChar).Value = DataGridView1.Rows.Item(i).Cells(2).Value.ToString
cmd.ExecuteNonQuery()
Next i
MsgBox([Ô]Grid Salvo.[Ô], MsgBoxStyle.Information)
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Using
End Sub
Funcionou em partes, ta salvando a mesma linha(a primeira) varias vezes, e não percorrendo linha a linha.
Você colocou o cmd.Parameters.Clear() dentro do comando For?
Não, não usei em nenhum momento.
Eu coloquei ele na minha penultima postagem. é a primeira linha dentro do comando For. Faça conforme eu coloquei lá e teste.
Tópico encerrado , respostas não são mais permitidas