2011-01-10 4 views
0

Я спрашиваю, потому что, когда я использую GetUpdateCommand() или GetInsertCommand() из моего SqlCommandBuilder, генерируемый SqlCommand имеет свой член соединения, но в закрытом состоянии. Мне интересно, какое соединение оно использует, потому что я не вижу ни одного члена соединения в этом объекте, и соединение в SqlCommandBuilder.DataAdapter.SelectCommand открыто (свойства Update/Delete/InsertCommand равны null).Какое соединение использует SqlCommandBuilder для генерации запросов?

Где я должен проверить состояние соединения перед запуском GetUpdateCommand() или GetInsertCommand()? Или я должен просто открыть их внутреннюю связь, если она закрыта?

BTW, я использую .Net 4 с SQL Server 2008.

+0

Вы уверены, что это соединение? Он имеет (нуждается) метаданные из SELECT –

+0

Да, я уверен, потому что получаю исключение («ExecuteNonQuery требует открытого и доступного соединения. Текущее состояние соединения закрыто»), когда я выполняю команду, сгенерированную с помощью этого метода. – Antoine

ответ

0

AFAIK использует команду SqlCommandBuilder.DataAdapter.SelectCommand для создания новой команды, однако это делается только в первый раз, когда вы пытаетесь получить доступ к команде. После первой попытки экземпляр команды сохраняется и восстанавливается только текст команды.

+0

Да, его истинное обращение, т.е. * GetInsertCommand * несколько раз приведет к изменению текста команды на ранее возвращенных экземплярах SqlCommand. Но это все равно означает, что в итоге сгенерированная команда будет использовать соединение из * SqlCommandBuilder.DataAdapter.SelectCommand * –

+0

Хорошо, но это не объясняет состояния соединений, которые отличаются. Во всяком случае, я обошел проблему, повторно установив соединение с командой и, похоже, работает до сих пор. – Antoine

0

При вызове GetXXXCommand на ваш SqlCommandBuilder будет внутренне создать новую команду на подключение установленного на DataAdapter (DataAdapter.SelectCommand.Connection.CreateCommand()). Это означает, что соединение должно быть одинаковым для всей команды, которую создает строитель, и состояние open/closed должно быть таким же.

Как выглядит ваш код, который определяет, что состояние открыто на SqlCommandBuilder.DataAdapter.SelectCommand.Connection, но не на SqlCommandBuilder.GetInsertCommand().Connection!?

+0

Я просто смотрю на него в отладчике после вызова GetUpdateCommand(). Как пояснялось в комментариях к этому вопросу, я понял это при отладке ошибки при запуске ExecuteNonQuery() в сгенерированной команде. – Antoine

+0

Я не буду имплицитно доверять отладчику по этому вопросу, скорее сделаю некоторые реальные тесты кода ... или просто убедитесь, что соединение открыто, прежде чем что-либо сделать против него. –

+0

Я считаю, что лучше, если я использую уже открытое соединение, а не открываю закрытое. – Antoine

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