2011-06-13 77 views
1

我打一個MS Access數據庫與VB2005和我創造這樣VB.NET合併多個表,然後更新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:UpdateCommand的動態SQL生成不支持不返回任何鍵列信息的SelectCommand。

我不確定我明白爲什麼合併數據無法推送到數據庫。

回答

0

我剛纔在數據庫表中添加主鍵時遇到了同樣的問題,命令生成器需要一個唯一標識字段來生成正確的命令。 您可以簡單地創建一個名爲「id」的字段並設置自動編號,然後您不必手動更新它並使其成爲主鍵即可