从 DataTable 更新 OleDB table 的最简单方法
Easiest way to update a OleDB table from a DataTable
从之前修改过的导入 table 更新完整 OleDB
table 的最简单方法是什么 (vb.NET
)?
这是我的。
首先,我从 Access
数据库导入 table:
Dim PRDB As String = "Provider=Microsoft.ACE.OLEDB.12.0;
Data Source=<location>;
Jet OLEDB:Database Password=<password>"
Dim CNDB As New OleDb.OleDbConnection(PRDB)
Dim CMDB As New OleDb.OleDbCommand
Dim ADDB As New OleDb.OleDbDataAdapter(CMDB)
Dim TBDB As New DataTable
Try : CNDB.Open()
Catch EX As Exception : MsgBox(EX.ToString) : End Try
Try : CMDB.CommandText = "SELECT * FROM [TABLE 01]" : ADDB.Fill(TBDB)
Catch EX As Exception : MsgBox(EX.ToString) : End Try
到目前为止一切顺利。我成功地将 TABLE 01
导入到 TBDB
。
现在,假设我更改了 DataTable
:
的一个单元格
TBDB.Rows(2).Item(3) = "CHANGED"
有没有办法直接更新 OleBD
table 而无需描述更改的单元格地址?像
ADDB.Update(TBDB) (?)
我已经尝试了最后一段代码,但它没有用(我认为只有当参数是 DataRow
而不是 DataTable
时它才有效)。
我研究了这个问题,但对于这个(明显的)简单任务,我找到的所有答案看起来都有点复杂。所以我想知道是否有更直接的方法来做到这一点 - 我也阅读了一些关于 Binders
的内容,但我不太了解该方法。
谢谢
在SQL服务器中等价于:
Private Sub UpdateDBFromDataTable(myDataTable As DataTable)
'Change with your connection string
Dim connectionString As String = "Data Source = MyServerName/Instance; Integrated Security=true; Initial Catalog=YourDatabase"
Using connection As SqlConnection = New SqlConnection(connectionString)
connection.Open()
Using bulkCopy As SqlBulkCopy = New SqlBulkCopy(connection)
For Each c As DataColumn In myDataTable.Columns
bulkCopy.ColumnMappings.Add(c.ColumnName, c.ColumnName)
Next
'Put here your table name in Database
bulkCopy.DestinationTableName = myDataTable.TableName
Try
bulkCopy.WriteToServer(myDataTable)
Catch ex As Exception
Console.WriteLine(ex.Message)
End Try
End Using
End Using
End Sub
感谢@Fadi,我设法使用 OleDbCommandBuilder
:
找到了我正在寻找的确切方法
Dim CMNDBUID As OleDb.OleDbCommandBuilder
CMNDBUID = New OleDb.OleDbCommandBuilder(ADDB)
CMNDBUID.GetUpdateCommand()
然后我可以轻松更新 Access
table:
Try : ADDB.Update(TBDB)
Catch EX As Exception : MsgBox(EX.ToString) : End Try
从之前修改过的导入 table 更新完整 OleDB
table 的最简单方法是什么 (vb.NET
)?
这是我的。
首先,我从 Access
数据库导入 table:
Dim PRDB As String = "Provider=Microsoft.ACE.OLEDB.12.0;
Data Source=<location>;
Jet OLEDB:Database Password=<password>"
Dim CNDB As New OleDb.OleDbConnection(PRDB)
Dim CMDB As New OleDb.OleDbCommand
Dim ADDB As New OleDb.OleDbDataAdapter(CMDB)
Dim TBDB As New DataTable
Try : CNDB.Open()
Catch EX As Exception : MsgBox(EX.ToString) : End Try
Try : CMDB.CommandText = "SELECT * FROM [TABLE 01]" : ADDB.Fill(TBDB)
Catch EX As Exception : MsgBox(EX.ToString) : End Try
到目前为止一切顺利。我成功地将 TABLE 01
导入到 TBDB
。
现在,假设我更改了 DataTable
:
TBDB.Rows(2).Item(3) = "CHANGED"
有没有办法直接更新 OleBD
table 而无需描述更改的单元格地址?像
ADDB.Update(TBDB) (?)
我已经尝试了最后一段代码,但它没有用(我认为只有当参数是 DataRow
而不是 DataTable
时它才有效)。
我研究了这个问题,但对于这个(明显的)简单任务,我找到的所有答案看起来都有点复杂。所以我想知道是否有更直接的方法来做到这一点 - 我也阅读了一些关于 Binders
的内容,但我不太了解该方法。
谢谢
在SQL服务器中等价于:
Private Sub UpdateDBFromDataTable(myDataTable As DataTable)
'Change with your connection string
Dim connectionString As String = "Data Source = MyServerName/Instance; Integrated Security=true; Initial Catalog=YourDatabase"
Using connection As SqlConnection = New SqlConnection(connectionString)
connection.Open()
Using bulkCopy As SqlBulkCopy = New SqlBulkCopy(connection)
For Each c As DataColumn In myDataTable.Columns
bulkCopy.ColumnMappings.Add(c.ColumnName, c.ColumnName)
Next
'Put here your table name in Database
bulkCopy.DestinationTableName = myDataTable.TableName
Try
bulkCopy.WriteToServer(myDataTable)
Catch ex As Exception
Console.WriteLine(ex.Message)
End Try
End Using
End Using
End Sub
感谢@Fadi,我设法使用 OleDbCommandBuilder
:
Dim CMNDBUID As OleDb.OleDbCommandBuilder
CMNDBUID = New OleDb.OleDbCommandBuilder(ADDB)
CMNDBUID.GetUpdateCommand()
然后我可以轻松更新 Access
table:
Try : ADDB.Update(TBDB)
Catch EX As Exception : MsgBox(EX.ToString) : End Try