Я хочу получить данные из таблицы базы данных, изменить их и обновить, не завися от поставщика базы данных и структуры базы данных, поскольку она будет частью библиотеки.
Моя первая попытка была следующей:
'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
.