2010-03-15 2 views
1

Какой синтаксис для запроса на обновление таблицы без первичного ключа?MS-Access: TableAdapter UpdateCommand для таблицы без первичного ключа

Отказ от ответственности: К сожалению, добавление первичного ключа не является обязательным. Моя программа - небольшая программа в гораздо более крупной системе с плохим управлением данными. Мое время разработки не включает переписывание другого программного обеспечения.

Примечание: База данных - это Microsoft Access.

Примечание: Аналогично: Excel: TableAdapter UpdateCommand for table without primary key

UPDATE: «Если таблица в базе данных нет явного первичного ключа, то есть не может быть действительным TableAdapter UpdateCommand» Я правильно говорю,

ответ

2

Если нет явного первичный ключ, по крайней мере, должен быть неявный первичный ключ (даже если это каждый столбец). Без какого-либо ключа вы не сможете безопасно обновите таблицу.

Если вы идете через мастер при создании набора данных, вы должны получить запрос на обновление, которое включает оператор обновления, подобную этой:

 
update TableA 
set Column1 = @Column1, Column2 = @Column2 ... 
where Column1 = @PreviousColumn1 and Column2 = @PreviousColumn2 ... 

EDIT
Вы не сможете использовать мастер для обновления или удаления команд без ПК в таблице. Тем не менее, вы можете сделать копию файла Access, помещенного в таблицу PK (если вы не можете получить короткий неявный ключ, вам может понадобиться использовать каждый столбец) и использовать его для создания команд с помощью мастера.

Если вы не хотите проходить этот шаг, вам придется создать запрос, аналогичный приведенному выше. Параметры @PreviousColumnX будут иметь значения SourceVersion, равные Original.

update TableA 
set Column1 = @Column1, Column2 = @Column2 ... 
where (Column1 = @PreviousColumn1 or @PreviousColumn1 is null) 
    and Column2 = @PreviousColumn2 ... 
+0

Я думаю, что он НЕ создан для вас, если у вас нет первичного ключа (и, возможно, если у вас есть предложение join, вы его не получите ... Я что-то помню об этом ... Прошло много времени). Вам придется вручную создать один, да. –

+1

В соответствии с этим сообщением: http://social.msdn.microsoft.com/Forums/en-US/adodotnetdataproviders/thread/4b5b3007-7a6e-4372-ae34-578d0b33725a добавление первичного ключа также должно быть выполнено в базе данных. –

+0

Правильно ли я говорю: «Если в таблице в базе данных нет явного первичного ключа, тогда не может быть допустимого параметра TableAdapter UpdateCommand?» – Steven

3

Это не что иное, как если у вас есть первичный ключ. Тем не менее, вам нужно будет установить какое-то предложение where, которое позволит вам однозначно идентифицировать строку.

+3

Да, но TableAdapter потерпит неудачу, если количество строк, не соответствует тому, что, как ожидается, (то есть, если вы обновляете одну строку из DataTable, и более чем одна строка соответствует условию) –

+0

Is есть способ просто заменить содержимое DataTable содержимым в памяти (в DataSet)? В таблице всего 50 строк. – Steven

+0

@Steven: Нет, вам нужно использовать инструкцию UPDATE. –

0

Какая СУБД вы используете? В Oracle (и, возможно, у других, но у меня больше опыта работы с Oracle) существует псевдо-столбец ROWID, который можно использовать как уникальный идентификатор строки, даже если нет первичного ключа

+0

MS Access (я только что отредактировал основную запись) – Steven

Смежные вопросы