2011-05-27 154 views
0

我想要從數據庫表中獲取數據修改並更新它,而不依賴於數據庫提供程序和數據庫結構,因爲它將成爲庫的一部分。DbCommandBuilder不按預期工作

我第一次嘗試如下:

'factory defined somewhere else as DbProviderFactory 
'connection is a working DbConnection 
Dim selectcmd As DbCommand = connection.CreateCommand() 
Dim adapter As DbDataAdapter = factory.CreateDataAdapter() 
Dim builder As DbCommandBuilder = factory.CreateCommandBuilder() 

selectcmd.Connection = connection 
selectcmd.CommandText = "SELECT * FROM tbl1" 
adapter.SelectCommand = selectcmd 
builder.DataAdapter = adapter 

Dim ds As New DataSet 
'Fetch data 
adapter.Fill(ds) 

'Change something in ds 

adapter.Update(ds) '<- exception occurs 

這並沒有工作,因爲CommandBuilder沒有產生Update-Insert-DeleteCommand自動儘管文件稱它應該做的。

但是,即使我說

adapter.InsertCommand = builder.GetInsertCommand() 
adapter.UpdateCommand = builder.GetUpdateCommand() 
adapter.DeleteCommand = builder.GetDeleteCommand() 

沒有奏效。經過進一步調查,我發現生成的CommandsCommandBuilder是無用的,因爲它插入了?而不是@param1,對於所有Parameters。它生成的東西類似INSERT INTO tbl1 (field1, field2, field3) VALUES (?, ?, ?)InsertCommand

我真的很喜歡使用CommandBuilder,因爲它很簡單,我沒有像JOINS那樣複雜的東西。

+0

你用什麼Db? '?'看起來適合Access,也許適合其他人。 – 2011-05-27 17:50:22

+0

對於測試,我使用了一個Access mdb的OleDb – Karsten 2011-05-27 17:51:59

+0

它是否失敗/使用Access?在第二部分中,你說「沒有工作」,完全沒有幫助。總是描述發生了什麼,你的期望等等。 – 2011-05-27 17:55:10

回答

2

也許你對你的表包含保留字在接入列名,這裏有:

http://support.microsoft.com/kb/248738

你應該改變的列名,甚至更好地利用它們列在SELECT子句中,並使用[和] ,像這樣的東西

select [username], [password], [time] from tbl1 
+0

真的解決了這個問題!我有兩個名爲「Section」和「Value」的列,這些列是保留字。非常感謝你! – Karsten 2011-05-27 20:50:04