Нужно ли вызывать SqlCommandBuilder.GetUpdateCommand () перед использованием SqlDataAdpater.Update ()? - PullRequest
5 голосов
/ 25 июня 2010

Когда я использую SqlCommandBuilder для отправки обновлений / вставок / удалений на сервер, мне нужно вызывать .GetUpdateCommand(), .GetInsertCommand() и .GetDeleteCommand()?

using (var adapter = new SqlDataAdapter("select * from MyTable", _connection))
using (var builder = new SqlCommandBuilder(adapter))
{
    adapter.Fill(dt);

    //Magic happens        

    builder.GetUpdateCommand(); //is this line necessary
    builder.GetInsertCommand(); //is this line necessary
    adapter.Update(dt);
}

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

1 Ответ

5 голосов
/ 25 июня 2010

Я провел некоторое тестирование в своей тестовой базе данных, чтобы посмотреть, смогу ли я придумать сценарий, в котором произошла бы ошибка, если бы я НЕ вызывал GetInsertCommand().Оказывается, это может произойти, в моем случае это произошло, когда я обновлял несколько разных таблиц в базе данных.

По какой-то причине при обновлении моей 4-й таблицы она не могла корректно вставляться.Это беспокоило меня, поэтому я решил сделать немного больше исследований, которые привели меня сюда .Обратите особое внимание на:

После первого создания оператора Transact-SQL приложение должно явно вызвать RefreshSchema, если оно каким-либо образом изменяет оператор.В противном случае GetInsertCommand будет по-прежнему использовать информацию из предыдущего оператора, что может быть неверно.

Это говорит о том, что он МОЖЕТ работать без вызова, но лучше вызывать его.Я пытался найти причину, почему иногда это работает, а иногда нет.Но я не смог понять это полностью.

...