VB.NET Объединить несколько таблиц, а затем обновить базу данных MS Access - PullRequest
1 голос
/ 13 июня 2011

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

Я не уверен, что понимаю, почему объединенные данные невозможно отправить в базу данных.

1 Ответ

0 голосов
/ 25 августа 2017

У меня была такая же проблема, прежде чем просто добавить первичный ключ в таблицу базы данных, сборщик команд нуждается в уникальном поле идентификации для генерации правильной команды.Вы можете просто создать поле с именем "id" и сделать авто-номер, тогда вам не нужно обновлять его вручную и сделать его первичным ключом, вот и все

...