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

时间:2016-08-17 14:44:28

标签: vb.net ms-access merge

我正在尝试合并两个表并使用来自两个单独的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)

1 个答案:

答案 0 :(得分:0)

我不知道有几个细节。例如,如果源/主服务器删除了目标中尚未删除的行,是否应将其作为合并的一部分删除?由于它们不存在于Source中,因此除非您手动处理它们,否则它们在此过程中不会发生任何事情。我忽略了这个方面,因为没有提到。

要知道的关键要素是每行都有RowState表示DataAdapter将对每行做什么 - 如果有的话。有一些关键步骤元素错误或缺失:

  • DataAdapter填充表格时,它会将所有行状态设置为“未更改”。为了使源行符合插入/更新Dest的条件,您希望它们具有已添加的RowStateAcceptChanges清除所有状态标志。
  • 为了防止简单地添加副本(使用新的ID),您还需要加载架构,以便它可以比较PK并知道如何处理新行。
  • 合并后,使用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

结果:

enter image description here

  • XRay在源头,但不是dest,所以它被添加。
  • 所有RED项目仅在Source中使用,因此列数据在目标中更新,如通常所需。
  • 源中有3个新行已添加(未显示)

或许更重要的是,目标中存在项2 - Uniform,但已在源中删除。 DataAdapter不会删除它,因为它在那里且代码没有将RowState更改为Deleted。合并将根据所使用的选项累积行和列数据更改,但删除已删除的行更像是同步操作。 It is pretty simple to incorporate though