我正在尝试合并两个表并使用来自两个单独的MS访问数据库的合并记录更新一个表
两个表都相同,并且两个表都使用自动编号主键进行密码保护
以下代码合并数据集内存,或者至少通过msgbox消息合并记录计数。
但它没有更新到访问数据库中的表..
我在网上搜索得很长很难,而且我真的处于松散状态。
daDBTarget = New OleDbDataAdapter
daDBTarget.SelectCommand = New OleDbCommand("SELECT * FROM DBUSERTASK", Conn1)
daDBTarget.Fill(dsDBTarget, "tbl1")
daDBSource = New OleDbDataAdapter
daDBSource.SelectCommand = New OleDbCommand("SELECT * FROM DBUSERTASK", conn2)
daDBSource.Fill(dsDBSource, "tbl2")
MsgBox("Dataset 1 dstTaskComp is full with " & dsDBTarget.Tables(0).Rows.Count & vbCr & vbCr & "Dataset 2 dstTaskComp is full with " & dsDBSource.Tables(0).Rows.Count)
dsDBTarget.Tables("tbl1").Merge(dsDBSource.Tables("tbl2"), True)
MsgBox("Dataset 1 dstTaskComp is now merged and full with " & dsDBTarget.Tables(0).Rows.Count)
dsDBTarget.AcceptChanges()
Dim cb As New OleDbCommandBuilder(daDBTarget)
daDBTarget.Fill(dsDBTarget)
cb.GetUpdateCommand()
daDBTarget.Update(dsDBTarget)
答案 0 :(得分:0)
我不知道有几个细节。例如,如果源/主服务器删除了目标中尚未删除的行,是否应将其作为合并的一部分删除?由于它们不存在于Source中,因此除非您手动处理它们,否则它们在此过程中不会发生任何事情。我忽略了这个方面,因为没有提到。
要知道的关键要素是每行都有RowState
表示DataAdapter
将对每行做什么 - 如果有的话。有一些关键步骤元素错误或缺失:
DataAdapter
填充表格时,它会将所有行状态设置为“未更改”。为了使源行符合插入/更新Dest的条件,您希望它们具有已添加的RowState
。 AcceptChanges
清除所有状态标志。PreserveChanges = True
告诉OleDB 忽略对源级别的列级更改。不相关,但重要的是在完成它们后处置DB Provider对象。这将合并来自同一个DB的2个表,因此可以使用相同的连接,但以其他方式说明了该过程。我也跳过DataSets
,因为它们不是必需的。
Dim SQLa = "SELECT * FROM MergeA"
Dim SQLb = "SELECT * FROM MergeB"
Dim dtSrc As New DataTable
Dim dtDest As New DataTable
Using dbcon As New OleDbConnection(ACEConnStr)
Using da As New OleDbDataAdapter(SQLa, dbcon)
dbcon.Open()
' Do Not set the RowState to UnChanged, please
da.AcceptChangesDuringFill = False
da.Fill(dtSrc)
End Using
Using da As New OleDbDataAdapter(SQLb, dbcon)
Dim cb = New OleDbCommandBuilder(da)
' same connection, already open
' load the schema to get the PK etc
da.FillSchema(dtDest, SchemaType.Source)
da.Fill(dtDest)
' merge the tables
dtDest.Merge(dtSrc, False, MissingSchemaAction.Add)
Dim rows = da.Update(dtDest)
End Using ' close and dispose
End Using
结果:
或许更重要的是,目标中存在项2 - Uniform
,但已在源中删除。 DataAdapter
不会删除它,因为它在那里且代码没有将RowState
更改为Deleted
。合并将根据所使用的选项累积行和列数据更改,但删除已删除的行更像是同步操作。 It is pretty simple to incorporate though