【问题标题】:Update, Add rows to a datatable VB.Net更新,将行添加到数据表 VB.Net
【发布时间】:2013-05-11 12:58:56
【问题描述】:

我已经非常努力地解决了我的问题,这就是我想要做的:

  • 我有一个 XML 文件,我使用 ReadXML 将其加载到数据集(“ds”)中, 几个表被填充到数据集中,我关心的那个 about is ("SalesReceiptRet") 我将其称为源 表。
  • 我在 MS Access 数据库中有另一个表,我将它加载到同一个表中
    使用OleDBAdapter.Fill 将数据集放入名为 ("dtTarget") 的数据表中 并且适配器的名称是 ("dbAdapter")。

我想遍历源表中的所有记录,查找一个名为(“TxnID”)的字段来定位目标表中的记录。如果它不存在,则添加它,如果它确实执行另一个验证并使用源行覆盖/更新它。

代码如下:

Private Sub btnTest_Click(sender As Object, e As EventArgs) Handles btnTest.Click
    'Initialize command builder
    Dim dbCommandBuilder As New OleDb.OleDbCommandBuilder(dbAdapter)

    'Set the primary keys
    ds.Tables("dtTarget").PrimaryKey = New DataColumn() {ds.Tables("dtTarget").Columns("TxnID")}

    'Find rows
    Dim dr As DataRow
    Dim lookupRow As DataRow

    For Each dr In ds.Tables("SalesReceiptRet").Rows

        lookupRow = ds.Tables("dtTarget").Rows.Find(dr.Item(0))
        'If the a row with a similar TxnID exists, do the following validation
        If Not (lookupRow Is Nothing) Then
            If lookupRow.Item(8).ToString <> "Regular" Then
                'do something here to overwrite/update the matching row
            End If
        Else
            'If the row does not exist, import it
            ds.Tables("dtTarget").ImportRow(dr)
        End If

    Next

    'Update Access
    dbAdapter.Update(ds, "dtTarget")
    dbConnection.Close()


End Sub

也许我需要提一下,这两个表都有确切的列名,除了 Access“dtTarget”还有其他的,这似乎至少不会导致导入行出现问题。

有什么想法吗?

【问题讨论】:

  • 你的代码现在在做什么?不是在更新吗?不是在进口吗?是不是报错了?
  • 它可以正常导入但没有更新,因为我还没有为此写任何东西

标签: vb.net ado.net dataset


【解决方案1】:

这应该让你开始,

有关 Access 和适配器上的插入 /Update 的更多帮助,请参阅此链接 http://social.msdn.microsoft.com/Forums/en-US/adodotnetdataset/thread/958e6d51-725a-4649-8fc0-79a831f8f37e

Dim connStr As String = "Provider=SQLNCLI10;Server=(local);Database=MyNewTest;Uid=user; Pwd=******;"
Dim selectCmd As String = "select * from IdentityTest"
Dim dbAdapter As New OleDb.OleDbDataAdapter(selectCmd, connStr)
dbAdapter.AcceptChangesDuringUpdate = True

'code here to fille up your adapter
'build the insert and update comand on the adapter
Dim InsertCommans As New OleDb.OleDbCommand("INSERT INTO <table> (field1,field2,field3,field4) Values (@val1,@val2,@val3,@val4)")
Dim UpdateCommans As New OleDb.OleDbCommand("UPDATE <table> SET <field> = @Value WHERE <field> = @TxnID")

'Set the primary keys
Dim ds As DataSet
ds.Tables("dtTarget").PrimaryKey = New DataColumn() {ds.Tables("dtTarget").Columns("TxnID")}

'assign our datatables
Dim oDtSource As DataTable = ds.Tables("SalesReceiptRet")
Dim oDtTarget As DataTable : dbAdapter.Fill(oDtTarget)

'for each TxnID in our source table
For Each dr As DataRow In oDtSource.Rows

'get the rows in the target that match to the current source table row taxnid [colname] = TxnID
Dim oRowsInTarget As DataRow() = oDtTarget.Select("[" & oDtTarget.Columns(0).ColumnName & "] = " & dr("TxnID"))
'if there is a match (assuming there will only be one) and the column 8 contents (this is column 9 in reality)
'dowes not equal "Regular" then proceed to run the ole adapter update statement else insert
If oRowsInTarget.Count > 0 AndAlso Not oRowsInTarget(0)(8).ToString <> "Regular" Then
    'perform our update
    'you have thematching TxnId in dr("TxnID")
    'I think you can configure an insert and update statment on the Ole adapter connected to access
    'EXEC UPDATE ON THE ADAPTER
ElseIf oRowsInTarget.Count > 0 Then
    'EXEC INSERT ON THE ADAPTER
End If
Next

【讨论】:

  • 你好安德烈,谢谢你,我正在尝试使用该类的内置方法之一,就好像我要编写 UPDATE sql 命令一样,它会非常长.. 我有超过 60 列。
猜你喜欢
  • 2012-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多