ERRO AO SALVAR DADOS DE GRIDVIEW EM BANCO ACCESS

W8.LISBOA 03/03/2015 22:27:10
#444917
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:

      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??
JABA 03/03/2015 22:42:35
#444919
Resposta escolhida
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:

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
W8.LISBOA 03/03/2015 23:11:43
#444924
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!
JABA 03/03/2015 23:20:14
#444925
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í.
JABA 03/03/2015 23:25:29
#444926
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
W8.LISBOA 03/03/2015 23:39:08
#444927
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
JABA 03/03/2015 23:43:47
#444928
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

W8.LISBOA 03/03/2015 23:50:08
#444929
Funcionou em partes, ta salvando a mesma linha(a primeira) varias vezes, e não percorrendo linha a linha.
JABA 03/03/2015 23:55:00
#444930
Você colocou o cmd.Parameters.Clear() dentro do comando For?
W8.LISBOA 03/03/2015 23:58:19
#444931
Não, não usei em nenhum momento.
JABA 03/03/2015 23:59:50
#444932
Eu coloquei ele na minha penultima postagem. é a primeira linha dentro do comando For. Faça conforme eu coloquei lá e teste.
Página 1 de 2 [11 registro(s)]
Tópico encerrado , respostas não são mais permitidas