在单个查询中执行INSERT和SELECT。 ADODB引发“关闭对象时不允许操作”

时间:2018-10-16 08:51:39

标签: sql-server adodb

我有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 :(得分:2)

尝试将SET NOCOUNT ON添加到您的T-SQL批处理中,或者在处理SELECT查询的结果之后调用Recordset.NextResult方法。

SET NOCOUNT ON指示SQL Server禁止DONE_IN_PROC TDS协议消息(行数),经典ADO具有讨厌的习惯,即以没有列的封闭空记录集形式返回。无法用NextResult消耗这些资源将阻止整个T-SQL批处理运行到完成。

一个好的做法是调用NextResult直到该方法返回False为止,因为这将确保整个批处理都运行完成,而与SET NOCOUNT会话设置无关。请注意,此技术也适用于其他客户端API(ADO.NET,JDBC等),尽管使用结果的确切方法和症状(部分结果集,未检测到的异常)也有所不同。