VB.NET合并多个表,然后更新MS Access数据库

时间:2011-06-13 15:36:55

标签: vb.net ms-access dataset

我正在使用VB2005访问MS Access数据库,我正在创建一个像这样的表对象

Dim sSQL As String = "SELECT * FROM tblCars WHERE WeekOf=#6/1/2011#"
Dim da As New OleDb.OleDbDataAdapter(sSQL, conn)
Dim ds As New DataSet
da.Fill(ds, "CarData")
Dim cb As New OleDb.OleDbCommandBuilder(da)

由于数据是全新的,因此该表应该没有行。我读了一个包含新数据的数据文本文件,并将这些数据泵入表中并添加如下所示的新行:

'create a new empty row
Dim dsNewRow As DataRow = ds.Tables("CarData").NewRow()

'update the new row with fresh data
dsNewRow.Item("DriveDate") = dd
dsNewRow.Item("DCode") = dc
dsNewRow.Item("CarNum") = carID
'about 15 more fields

'add the filled row to the DataSet table
ds.Tables("CarData").Rows.Add(dsNewRow)

'end loop

'update the database with the new rows
da.Update(ds, "CarData")

db中的表没有主键,但所有这些都有效,我将所有新数据插入到数据表tblCars中。

现在碰巧我还必须考虑没有数据的汽车。为此,我的计划是从控制表中获取汽车列表并将其与数据表合并。

    Dim sSQL As String = "SELECT CarId FROM tblControlCars WHERE ActiveCar=True;"
    Dim daAct As New OleDb.OleDbDataAdapter(sSQL, conn)
    Dim ds As New DataSet
    daTail.Fill(ds, "ActCars")
    Dim cbAct As New OleDb.OleDbCommandBuilder(daAct)

然后我创建表的主键,然后合并它们。

    ds.Tables("CarData").Merge(ds.Tables("ActCars"))

这将为我提供一张表格,其中包含有数据的汽车的所有新数据,以及那些活跃但未获得任何数据的汽车的占位符。但是,当我尝试更新回db时,我收到错误

  

System.InvalidOperationException:对于不返回任何键列信息的SelectCommand,不支持UpdateCommand的动态SQL生成。

我不确定我理解为什么Merged数据无法推送到数据库。

1 个答案:

答案 0 :(得分:0)

在数据库表中添加主键之前,我遇到了同样的问题,命令构建器需要一个唯一的标识字段来生成正确的命令。 您只需创建一个名为" id"然后制作自动编号,然后您不必手动更新它并使其成为主键