Я использую базу данных MS Access с VB2005 и создаю табличный объект, подобный этому
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")
Таблица в БД не имеет первичных ключей, но все это работает, и все мои новые данные вставляются в таблицу данных 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"))
Это даст мне таблицу со всеми новыми данными для автомобилей, у которых есть данные, а также заполнитель для тех автомобилей, которые активны, но не получили никаких данных. Однако, когда я пытаюсь сделать обновление обратно в БД, я получаю сообщение об ошибке
System.InvalidOperationException: Динамическая генерация SQL для UpdateCommand не поддерживается для SelectCommand, которая не возвращает никакой информации ключевого столбца.
Я не уверен, что понимаю, почему объединенные данные невозможно отправить в базу данных.