ВСТАВЬТЕ и ВЫБЕРИТЕ в одном запросе.ADODB выдает «Операция не разрешена, когда объект закрыт» - PullRequest
0 голосов
/ 16 октября 2018

У меня есть 2 запроса, оба отлично работают в SQL Studio:

Запрос 1:

SELECT [id],[fullname] FROM persons WHERE [id] IN (5802824683954111059,1615647673927737)

Запрос 2:

IF OBJECT_ID('tempdb..#temp_table_1') IS NOT NULL
TRUNCATE TABLE #temp_table_1
ELSE
CREATE TABLE #temp_table_1 ( [key] bigint primary key );
INSERT INTO #temp_table_1 ([key]) VALUES (5802824683954111059),(1615647673927737);
SELECT [id],[fullname] FROM persons WHERE [id] IN (SELECT [key] FROM #temp_table_1)

Но когда я их выполняюзапросы, использующие метод ADODB.Recordset.Open (), только первый запрос возвращает действительный результат.

Для второго запроса свойство Recordset.EOF выдает ошибку «Операция не разрешена, когда объект закрыт».

Что не так со вторым запросом?Поддерживает ли ADODB несколько операторов в запросе?

Пример кода, демонстрирующий проблему:

    conn = new ActiveXObject( 'ADODB.Connection' );
    conn.Open( 'Provider=SQLOLEDB;Integrated Security=SSPI;Server=mt;Database=test;Integrated Security=SSPI' );

    rs = new ActiveXObject( 'ADODB.Recordset' );

    //sqlQuery = "SELECT [id],[fullname] FROM persons WHERE [id] IN (5802824683954111059,1615647673927737)";

    sqlQuery = "IF OBJECT_ID('tempdb..#temp_table_1') IS NOT NULL\r\n\
TRUNCATE TABLE #temp_table_1\r\n\
ELSE\r\n\
CREATE TABLE #temp_table_1 ( [key] bigint primary key );\r\n\
INSERT INTO #temp_table_1 ([key]) VALUES (5802824683954111059),(1615647673927737);\r\n\
SELECT [id],[fullname] FROM persons WHERE [id] IN (SELECT [key] FROM #temp_table_1)";

    rs.Open( sqlQuery, conn );
    while ( ! rs.EOF )
    {
        alert( rs.Fields( 'fullname' ) );
        rs.MoveNext();
    }

1 Ответ

0 голосов
/ 16 октября 2018

Попробуйте добавить SET NOCOUNT ON в пакет T-SQL или вызвать метод Recordset.NextResult после обработки результатов запроса SELECT.

SET NOCOUNT ON инструктирует SQL Server подавлять DONE_IN_PROC сообщения протокола TDS (количество строк), которое у классического ADO имеет неприятную привычку возвращаться как закрытые пустые наборы записей без столбцов.Неспособность использовать их с помощью NextResult не позволит запустить весь пакет T-SQL до завершения.

Рекомендуется вызывать NextResult до тех пор, пока метод не вернет значение False, поскольку это обеспечит выполнение всего пакета дозавершение независимо от настройки сеанса SET NOCOUNT.Обратите внимание, что этот метод также применим к другим клиентским API (ADO.NET, JDBC и т. Д.), Хотя точный метод получения результатов отличается, а также симптомы (частичные наборы результатов, необнаруженные исключения).

...