【问题标题】:Classic ASP, ADO, recordset not populating from Stored Procedure经典 ASP、ADO、记录集未从存储过程中填充
【发布时间】:2013-08-01 14:51:05
【问题描述】:

在经典 ASP 脚本中,我有一个执行存储过程的 sql 语句:

sql="exec my_stored_proc"

然后我尝试用结果填充 ADO Recordset 对象并循环遍历记录集。

存储过程本身正在填充一个虚拟表,过程的最后一行返回结果:

select tableName, subTable, FieldLabel, total, FieldOrder from @AdmissionsTable

当直接从 SQL 管理工作室执行时,我得到了结果,但是当从 ASP 页面执行时,这一行:

do while not rs.eof

导致错误“关闭对象时不允许操作。”

我知道这不是因为我正在尝试执行存储过程,而是因为我针对另一个存储过程对其进行了测试,并且能够将结果放入 rs 对象中。

是因为我使用的是虚拟表吗?还是别的什么?

额外代码:

sql 字符串分配后,我打开连接,设置 rs 对象,然后执行查询:

conn.Open strConnection
Set rs = server.createobject("ADODB.Recordset")
rs.open sql, conn

然后是错误行:

do while not rs.eof

进一步更新:

在 rs.open 行之后,我在 response.write "RS Populated" 中添加了一些调试代码,然后执行了这一行。但是在那之后错误仍然直接出现,所以我猜这意味着RS正在以某种方式立即关闭。不知道为什么。

进一步更新:

我至少已经隔离了这个问题。 err 对象返回“Query timeout”作为错误,rs.ActiveConnection.CommandTimeout 返回“30”作为我的超时值。

查询很大,至少需要 60 秒才能运行,所以我尝试设置 rs.ActiveConnection.CommandTimeout = 120,但它仍然失败并且 - 最令人抓狂的是 - 它仍然返回“30”作为超时值。

如果 rs.ActiveConnection.CommandTimeout = 120 无法增加超时时间,我该如何提高该值?

【问题讨论】:

  • 你能告诉我们你剩下的代码吗?你在哪里打开连接,或填充rs
  • 你的代码中有On Error Resume Next吗?
  • 你什么时候尝试设置rs.ActiveConnection.CommandTimeout

标签: sql asp-classic ado


【解决方案1】:

问题解决了。我必须在连接级别设置 CommandTimeout 属性:

conn.CommandTimeout=120

现在可以了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-24
    • 1970-01-01
    相关资源
    最近更新 更多