INSERT 和 SELECT 在单个查询中。 ADODB 抛出 "Operation is not allowed when the object is closed"
INSERT and SELECT in a single query. ADODB throws "Operation is not allowed when the object is closed"
我有 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() 方法执行这些查询时,只有第一个查询 returns 有效结果。
对于第二个查询 Recordset.EOF 属性 抛出 "Operation is not allowed when the object is closed" 错误。
第二个查询有什么问题? 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();
}
尝试将 SET NOCOUNT ON
添加到您的 T-SQL 批处理或在处理 SELECT
查询的结果后调用 Recordset.NextResult
方法。
SET NOCOUNT ON
指示 SQL 服务器抑制 DONE_IN_PROC
TDS 协议消息(行计数),经典的 ADO 有一个坏习惯,即返回没有列的封闭空记录集。未能使用 NextResult
消耗这些将阻止整个 T-SQL 批次 运行 完成。
调用 NextResult
直到方法 returns False 是一个好习惯,因为这将确保整个批处理运行完成,而不管 SET NOCOUNT
会话设置如何。请注意,此技术也适用于其他客户端 API(ADO.NET、JDBC 等),尽管使用结果的确切方法和症状(部分结果集、未检测到的异常)不同。
我有 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() 方法执行这些查询时,只有第一个查询 returns 有效结果。
对于第二个查询 Recordset.EOF 属性 抛出 "Operation is not allowed when the object is closed" 错误。
第二个查询有什么问题? 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();
}
尝试将 SET NOCOUNT ON
添加到您的 T-SQL 批处理或在处理 SELECT
查询的结果后调用 Recordset.NextResult
方法。
SET NOCOUNT ON
指示 SQL 服务器抑制 DONE_IN_PROC
TDS 协议消息(行计数),经典的 ADO 有一个坏习惯,即返回没有列的封闭空记录集。未能使用 NextResult
消耗这些将阻止整个 T-SQL 批次 运行 完成。
调用 NextResult
直到方法 returns False 是一个好习惯,因为这将确保整个批处理运行完成,而不管 SET NOCOUNT
会话设置如何。请注意,此技术也适用于其他客户端 API(ADO.NET、JDBC 等),尽管使用结果的确切方法和症状(部分结果集、未检测到的异常)不同。