我有一个带有签名的 T-SQL 存储过程
CREATE PROCEDURE MyProc
@recordCount INT OUTPUT
@param1 INT
...
当直接在 Sql Server 中执行时,该过程在 5 秒内运行,返回几个结果集,总计约 100 行。
使用 ADO.NETSqlDataAdapter.Fill
方法调用此过程以填充 aDataset
会导致 aSqlTimeoutException
在SqlCommand
3 分钟后(指定的超时间隔)。
更改存储过程,使其不再具有输出参数,并将所需的输出值作为最后一个结果集返回,解决了问题,整个过程按预期在 5 秒内运行。
但为什么?
我不想在不了解我是否真的解决了问题的情况下浏览我的代码库并修改此类行为的所有实例。
另一件需要注意的是,这仅在一个特定的服务器上很明显,该服务器的数据集比我们运行的其他类似数据库要大。肯定不是 Sql Server 设置?
更新
进入框架源,问题似乎在于元数据检索。对象的ConsumeMetaData
方法SqlDataReader
无限期挂起。但是,我在其他数据库上运行了测试并且无法重现,因此当通过 ADO.NET 调用此过程时,这是一个特定于数据库的问题......太好了。
更新二
已确认如果我将代码更改为OleDbDataAdapter
与 SQLOLEDB 或 SQLNCLI 提供程序类型一起使用,问题仍然存在。肯定跟关系有关。