DbCommandBuilder не работает должным образом - PullRequest
0 голосов
/ 27 мая 2011

Я хочу получить данные из таблицы базы данных, изменить их и обновить, не завися от поставщика базы данных и структуры базы данных, поскольку она будет частью библиотеки.

Моя первая попытка была следующей:

'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()

это не сработало. После дальнейшего изучения я выяснил, что сгенерированные Commands сгенерированные CommandBuilder были бесполезны, потому что он вставил ? вместо @param1 для всех Parameters. Он генерировал что-то вроде INSERT INTO tbl1 (field1, field2, field3) VALUES (?, ?, ?) для InsertCommand

Я бы очень хотел использовать CommandBuilder, потому что он прост, и у меня нет ничего сложного, например JOINS.

1 Ответ

2 голосов
/ 27 мая 2011

Может быть, ваша таблица содержит имена столбцов, которые являются зарезервированными словами в доступе, здесь есть:

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

вам следует изменить имена столбцов или даже лучше использовать перечислить их в предложении selectи используйте [и], что-то вроде этого

select [username], [password], [time] from tbl1
...