【发布时间】:2010-10-24 11:07:20
【问题描述】:
我有一个带有签名的 T-SQL 存储过程
CREATE PROCEDURE MyProc
@recordCount INT OUTPUT
@param1 INT
...
当直接在 Sql Server 中执行时,该过程在 5 秒内运行,返回几个结果集,总计约 100 行。
使用 ADO.NET SqlDataAdapter.Fill 方法调用此过程以填充 Dataset 会在 3 分钟(指定的超时间隔)后导致 SqlCommand 上的 SqlTimeoutException。
更改存储过程,使其不再有输出参数,并将所需的输出值作为最后一个结果集返回,解决了问题,整个过程按预期在 5 秒内运行。
但是为什么呢?
我不想在不了解我是否真的解决了问题的情况下查看我的代码库并修改所有此类行为的实例。
另外需要注意的是,这仅在一个特定的服务器上很明显,该服务器拥有比我们运行的其他类似数据库更大的数据集。确定不是 Sql Server 设置?
更新
进入框架源,问题似乎在于元数据检索。 SqlDataReader 对象的 ConsumeMetaData 方法无限期挂起。但是我在其他数据库上运行了测试并且无法重现,因此当通过 ADO.NET 调用此过程时,这是一个特定于数据库的问题......太好了。
更新 II
已确认如果我将代码更改为将OleDbDataAdapter 与 SQLOLEDB 或 SQLNCLI 提供程序类型一起使用,问题仍然存在。肯定与连接有关。
【问题讨论】:
-
如果您使用数据阅读器,这是否有效?您是否查看过 sql profiler 而它卡在 sqldataadapter.fill 中?
-
同样处理 SqlDataReader。也对其进行了分析。交互式地我看到它需要不到 5 秒的持续时间,通过 ADO.NET 的完全相同的调用,探查器显示它需要超时持续时间(180000 毫秒)。 Fill 方法挂起并保持连接直到超时。
标签: sql-server tsql ado.net timeout output-parameter