我的代码似乎合并了数据集,但它没有更新到访问数据库

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,您希望它们具有已添加的 RowStateAcceptChanges 清除所有状态标志。 为了防止简单地添加副本(使用新 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.

【讨论】:

感激不尽,这不仅工作完美,而且我的生活正在恢复,现在我的头脑和思想都已清理干净,生活再次变得正常......我一直在努力周..谢谢你 使用和调试可能会让人感到困惑,因为很多数据可能是相同的 - 这取决于您要去的“方向”。

以上是关于我的代码似乎合并了数据集,但它没有更新到访问数据库的主要内容,如果未能解决你的问题,请参考以下文章

如何访问 xml 提要上的属性

将数据集的两个结果合并为一个

TensorFlow 数据集 API:缓存

熊猫使用 loc 更改特定行的数据集值

如何重新训练/更新 keras 模型?

尝试合并两个不同数据框的两列时出现问题?