保存一个DataGridView数据到Access数据库
Save a DataGridView data to Access database
我正在尝试将 DataGridView 数据保存到 Access 数据库(数据库已连接到 Visual Studio)。
这是我的代码:
Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
Try
Dim cn As OleDbConnection
cn = New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source= |DataDirectory|\GEFORSERVI V2.1.accdb;")
cn.Open()
Dim cmd As New OleDbCommand
cmd.Connection = cn
cmd.CommandType = Data.CommandType.Text
Dim Strcommandtext As String = "inserto into Factura(Designacao,PrecoUnitario,Qtd,Total,Nome,Entidade,NIF,Telefone,Morada,CodigoProduto,DataEmissao) VALUES(@Servico_Produto,@Valor,@Qtd,@Total,@Nome,@Entidade,@NIF,@Telemovel,@Bairro,@Data_de_Emissao)"
Dim values As String = ""
For i As Integer = 0 To Factura2DataGridView.Rows.Count - 1
values = Strcommandtext & Factura2DataGridView.Rows(i).Cells(11).Value & ")"
cmd.CommandText = values
cmd.ExecuteNonQuery()
Next i
cmd = Nothing
cn.Close()
MsgBox("Your Record Inserted Successfully ")
Catch myException As Exception
MsgBox("No Record Inserted" + myException.ToString())
Finally
'MsgBox("Closing Connection")
End Try
End Sub
需要释放 Connection
s 和 Command
s 以便释放非托管资源。 Using...End Using
块是处理此问题的最佳方法,因为即使出现错误也会这样做。在此代码中,连接和命令都包含在 Using
块中。请注意第一行 Using
末尾的逗号。
将 CommandText
和 Connection
直接传递给命令的构造函数。我注意到您错过了字段列表中的一个参数。我还注意到您输入了“inserto”。我相信一定是“插入”。没有必要设置 CommandType
因为 CommandType.Text
是默认值。
在 OleDb 中,参数在 sql 字符串中出现的顺序必须与它们添加到参数集合中的顺序相匹配。
在循环外构建一次参数集合。只有参数的值在循环中发生变化。
在循环外打开一次连接。
Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
Try
Using cn As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source= |DataDirectory|\GEFORSERVI V2.1.accdb;"),
cmd As New OleDbCommand("Insert into Factura(Designacao,PrecoUnitario,Qtd,Total,Nome,Entidade,NIF,Telefone,Morada,CodigoProduto,DataEmissao)
VALUES(@Servico_Produto,@Valor,@Qtd,@Total,@Nome,@Entidade,@NIF,@Telemovel,@Bairro,@CodigoProduto,@Data_de_Emissao)", cn)
With cmd.Parameters
.Add("@Servico_Produto", OleDbType.Integer)
.Add("@Valor", OleDbType.VarWChar)
.Add("@Qtd", OleDbType.Integer)
.Add("@Total", OleDbType.Decimal)
.Add("@Nome", OleDbType.VarWChar)
.Add("@Entidade", OleDbType.VarWChar)
.Add("@NIF", OleDbType.VarWChar)
.Add("@Telemovel", OleDbType.VarWChar)
.Add("@Bairro", OleDbType.VarWChar)
.Add("@CodigoProduto", OleDbType.Integer)
.Add("@Data_de_Emissao", OleDbType.Date)
End With
cn.Open()
For i As Integer = 0 To Factura2DataGridView.Rows.Count - 1
cmd.Parameters("@Servico_Produto").Value = Factura2DataGridView.Rows(i).Cells(0).Value
cmd.Parameters("@Valor").Value = Factura2DataGridView.Rows(i).Cells(1).Value
cmd.Parameters("@Qtd").Value = Factura2DataGridView.Rows(i).Cells(2).Value
cmd.Parameters("@Total").Value = Factura2DataGridView.Rows(i).Cells(3).Value
cmd.Parameters("@Nome").Value = Factura2DataGridView.Rows(i).Cells(4).Value
cmd.Parameters("@Entidade").Value = Factura2DataGridView.Rows(i).Cells(5).Value
cmd.Parameters("@NIF").Value = Factura2DataGridView.Rows(i).Cells(6).Value
cmd.Parameters("@Telemovel").Value = Factura2DataGridView.Rows(i).Cells(7).Value
cmd.Parameters("@Bairro").Value = Factura2DataGridView.Rows(i).Cells(8).Value
cmd.Parameters("@CodigoProduto").Value = Factura2DataGridView.Rows(i).Cells(9).Value
cmd.Parameters("@Data_de_Emissao").Value = Factura2DataGridView.Rows(i).Cells(10).Value
cmd.ExecuteNonQuery()
Next
End Using
MsgBox("Your Record Inserted Successfully ")
Catch myException As Exception
MsgBox("No Record Inserted" + myException.Message)
End Try
End Sub
有更简单的方法可以做到这一点。如果您将 DataTable
绑定到 DataGridView
,则可以使用 DataAdpater.Update
方法。
我正在尝试将 DataGridView 数据保存到 Access 数据库(数据库已连接到 Visual Studio)。
这是我的代码:
Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
Try
Dim cn As OleDbConnection
cn = New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source= |DataDirectory|\GEFORSERVI V2.1.accdb;")
cn.Open()
Dim cmd As New OleDbCommand
cmd.Connection = cn
cmd.CommandType = Data.CommandType.Text
Dim Strcommandtext As String = "inserto into Factura(Designacao,PrecoUnitario,Qtd,Total,Nome,Entidade,NIF,Telefone,Morada,CodigoProduto,DataEmissao) VALUES(@Servico_Produto,@Valor,@Qtd,@Total,@Nome,@Entidade,@NIF,@Telemovel,@Bairro,@Data_de_Emissao)"
Dim values As String = ""
For i As Integer = 0 To Factura2DataGridView.Rows.Count - 1
values = Strcommandtext & Factura2DataGridView.Rows(i).Cells(11).Value & ")"
cmd.CommandText = values
cmd.ExecuteNonQuery()
Next i
cmd = Nothing
cn.Close()
MsgBox("Your Record Inserted Successfully ")
Catch myException As Exception
MsgBox("No Record Inserted" + myException.ToString())
Finally
'MsgBox("Closing Connection")
End Try
End Sub
Connection
s 和 Command
s 以便释放非托管资源。 Using...End Using
块是处理此问题的最佳方法,因为即使出现错误也会这样做。在此代码中,连接和命令都包含在 Using
块中。请注意第一行 Using
末尾的逗号。
将 CommandText
和 Connection
直接传递给命令的构造函数。我注意到您错过了字段列表中的一个参数。我还注意到您输入了“inserto”。我相信一定是“插入”。没有必要设置 CommandType
因为 CommandType.Text
是默认值。
在 OleDb 中,参数在 sql 字符串中出现的顺序必须与它们添加到参数集合中的顺序相匹配。
在循环外构建一次参数集合。只有参数的值在循环中发生变化。
在循环外打开一次连接。
Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
Try
Using cn As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source= |DataDirectory|\GEFORSERVI V2.1.accdb;"),
cmd As New OleDbCommand("Insert into Factura(Designacao,PrecoUnitario,Qtd,Total,Nome,Entidade,NIF,Telefone,Morada,CodigoProduto,DataEmissao)
VALUES(@Servico_Produto,@Valor,@Qtd,@Total,@Nome,@Entidade,@NIF,@Telemovel,@Bairro,@CodigoProduto,@Data_de_Emissao)", cn)
With cmd.Parameters
.Add("@Servico_Produto", OleDbType.Integer)
.Add("@Valor", OleDbType.VarWChar)
.Add("@Qtd", OleDbType.Integer)
.Add("@Total", OleDbType.Decimal)
.Add("@Nome", OleDbType.VarWChar)
.Add("@Entidade", OleDbType.VarWChar)
.Add("@NIF", OleDbType.VarWChar)
.Add("@Telemovel", OleDbType.VarWChar)
.Add("@Bairro", OleDbType.VarWChar)
.Add("@CodigoProduto", OleDbType.Integer)
.Add("@Data_de_Emissao", OleDbType.Date)
End With
cn.Open()
For i As Integer = 0 To Factura2DataGridView.Rows.Count - 1
cmd.Parameters("@Servico_Produto").Value = Factura2DataGridView.Rows(i).Cells(0).Value
cmd.Parameters("@Valor").Value = Factura2DataGridView.Rows(i).Cells(1).Value
cmd.Parameters("@Qtd").Value = Factura2DataGridView.Rows(i).Cells(2).Value
cmd.Parameters("@Total").Value = Factura2DataGridView.Rows(i).Cells(3).Value
cmd.Parameters("@Nome").Value = Factura2DataGridView.Rows(i).Cells(4).Value
cmd.Parameters("@Entidade").Value = Factura2DataGridView.Rows(i).Cells(5).Value
cmd.Parameters("@NIF").Value = Factura2DataGridView.Rows(i).Cells(6).Value
cmd.Parameters("@Telemovel").Value = Factura2DataGridView.Rows(i).Cells(7).Value
cmd.Parameters("@Bairro").Value = Factura2DataGridView.Rows(i).Cells(8).Value
cmd.Parameters("@CodigoProduto").Value = Factura2DataGridView.Rows(i).Cells(9).Value
cmd.Parameters("@Data_de_Emissao").Value = Factura2DataGridView.Rows(i).Cells(10).Value
cmd.ExecuteNonQuery()
Next
End Using
MsgBox("Your Record Inserted Successfully ")
Catch myException As Exception
MsgBox("No Record Inserted" + myException.Message)
End Try
End Sub
有更简单的方法可以做到这一点。如果您将 DataTable
绑定到 DataGridView
,则可以使用 DataAdpater.Update
方法。