пятница, 17 июня 2011 г.

ADODB.Recordset error '800a0e78' Operation is not allowed when the object is closed.

У меня это случилось при миграции старого веб-приложения (ASP) на новый веб и сиквел сервер. Были изменены параметры подключения (с ODBC на OLE DB). Приложение подключалось к базе данных, SQL Profiler показывал, что команды исполняются, однако часть кода

set objDBConnection = Server.CreateObject("ADODB.Connection")
Set objRs = Server.CreateObject( "ADODB.RecordSet")
objDbConnection.Open(ConnectionString)
objRs.Execute("EXEC someStoredProcedure")


возвращало закрытый объект objRs и ошибку ADODB.Recordset error '800a0e78' , чего не случалось до миграции.
Немножко поковырявшись и погуглив, нашел следующее: вызовы stored procedures, сделанные через ODBC не возвращают "(x) rows affected", а OLE DB - возвращают. Соответственно, встретив эту строчку в ответе, OLE DB неверно интерпретирует ее как отсутствие данных и закрывает объект. Починить это можно двумя способами - поставив SET NOCOUNT ON вначале кода stored procedure (более правильный способ) или включив no count глобально на уровне сервера (на уровне базы данных, к сожалению, этого не сделать).
В связи с этим приходит следующая мысль: обязательное использование SET NOCOUNT ON в начале кода stored procedure - это хороший тон.

Источник: http://tutorials.aspfaq.com/8000xxxxx-errors/why-do-i-get-800a0cc1-errors.html

Комментариев нет: