我的代码似乎合并了数据集,但它没有更新到访问数据库
Posted
技术标签:
【中文标题】我的代码似乎合并了数据集,但它没有更新到访问数据库【英文标题】:My code seems to merge datasets but it does not update to the access DB 【发布时间】:2016-08-17 14:44:27 【问题描述】:我正在尝试合并两个表并使用来自两个单独的 MS 访问数据库的合并记录更新一个表
两个表完全相同,并且两个表都使用自动编号主键进行密码保护
以下代码合并数据集内存,或者至少通过 msgbox 消息,记录计数是正确的。
但是并没有更新到access数据库中的表..
我已经在网上搜索了很长时间,但真的很迷茫..
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)
【问题讨论】:
【参考方案1】:有几个细节我不知道。例如,如果源/主已删除目标中尚未(尚未)删除的行,是否应该将它们作为合并的一部分删除?由于它们不存在于 Source 中,因此除非您手动处理,否则在此过程中它们不会发生任何事情。我忽略了这方面,因为它没有被提及。
要知道的关键元素是每一行都有一个RowState
,指示DataAdapter
对每一行的作用(如果有的话)。有一些关键步骤元素错误或缺失:
DataAdapter
填充表时,它将所有行状态设置为未更改。为了使源行有资格插入/更新到 Dest,您希望它们具有已添加的 RowState
。 AcceptChanges
清除所有状态标志。
为了防止简单地添加副本(使用新 ID),您还需要加载架构,以便它可以比较 PK 并知道如何处理新行。
合并时,您使用PreserveChanges = True
,它告诉 OleDB忽略对源的列级别更改。
不相关,但重要的是在您使用完 DB Provider 对象后将其处理掉。这将合并来自同一个数据库的 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
结果:
XRay 在源中,但不在目标中,因此已添加。 所有 RED 项目仅在源中以这种方式出现,因此列数据在目标中按照通常需要进行了更新。 Source 中有 3 个新行已添加(未显示)也许更重要的是项目2 - Uniform
存在于目标中,但已在源中删除。 DataAdapter
不会删除它,因为它在那里并且代码没有将 RowState
更改为 Deleted
。合并将根据使用的选项累积行和列数据更改,但删除已删除的行更像是同步操作。 It is pretty simple to incorporate though.
【讨论】:
感激不尽,这不仅工作完美,而且我的生活正在恢复,现在我的头脑和思想都已清理干净,生活再次变得正常......我一直在努力周..谢谢你 使用和调试可能会让人感到困惑,因为很多数据可能是相同的 - 这取决于您要去的“方向”。以上是关于我的代码似乎合并了数据集,但它没有更新到访问数据库的主要内容,如果未能解决你的问题,请参考以下文章