2011-05-27 22 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