Обновление из DataGridView с помощью SqlDataAdapter

У меня есть DataGridView, который отображает данные из базы данных SQL Server. Это позволяет пользователю редактировать данные и сохранять их обратно в базу данных.

Способ сохранения данных обратно в базу данных примерно такой:

Dim da As New SqlDataAdapter
Dim cmdBuilder As New SqlCommandBuilder(da)

da.SelectCommand = New SqlCommand(sql, conn)

da.InsertCommand = cmdBuilder.GetInsertCommand

da.UpdateCommand = cmdBuilder.GetUpdateCommand

Dim cb As SqlCommandBuilder = New SqlCommandBuilder(da)
da.Update(dt)

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

Генерация динамического SQL для UpdateCommand не поддерживается для SelectCommand, который не возвращает информацию о ключевом столбце.

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

Спасибо!

РЕДАКТИРОВАТЬ: я также пытался вручную сгенерировать InsertCommand и UpdateCommand, но получил ту же ошибку.

РЕДАКТИРОВАТЬ 2: Оказалось, что я неправильно понял команды, когда сгенерировал их вручную. Как только я исправил, что он работал нормально, мое представление обновляется, и триггер срабатывает, как и ожидалось. Я предполагаю, что вы просто не можете автоматически генерировать команды для представления с помощью SqlCommandBuilder.


person OMill    schedule 11.04.2011    source источник
comment
есть ли в вашей таблице столбец первичного ключа?   -  person serhat_bundy    schedule 11.04.2011
comment
Базовая таблица имеет первичный ключ. Мне было интересно, не улавливает ли его SqlDataAdapter, потому что я указывал на представление, а не на таблицу. Я также сейчас думаю, что, возможно, я неправильно понял команды, когда пытался написать их вручную, поэтому я попробую еще раз...   -  person OMill    schedule 11.04.2011


Ответы (1)


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

http://social.msdn.microsoft.com/Forums/en-NZ/Vsexpressvcs/thread/5dec5633-ac84-48d9-8fd6-5c7601be4ccd

person serhat_bundy    schedule 11.04.2011