【发布时间】:2016-06-13 10:13:48
【问题描述】:
我有一些使用数据读取器访问存储过程的代码,它返回一些输出参数和一个结果集。数据读取器是使用 using 块创建的。
问题是我有时在尝试访问输出参数时得到“对象引用未设置为对象的实例”。我知道如果尝试访问输出参数时未关闭数据读取器,通常会收到此错误。但是,由于 datareader 是在 using 块中访问的,而访问输出参数的代码在 using 块之外,因此参数永远不应为 null。
这怎么可能?
SqlCommand command = new SqlCommand();
command.CommandText = "stored proc";
CommandBehavior commandBehavior = new CommandBehavior();
using (var reader = command.ExecuteReader(commandBehavior))
{
while(reader.Read())
{
//access record values
}
}
var param1 = command.Parameters["firstParam"].Value; //<-- null reference error here
为简洁起见,我省略了一些代码。
代码和 SQL 服务器在 VM 上运行。
其他相关事实:C# .Net Framework 4.0、SQL Server 2012
【问题讨论】:
-
是的,我正在其他地方访问该值。
-
你能展示你的存储过程吗?如果您遇到死锁,我想我已经看到了这样的错误。
-
不幸的是,我无法显示确切的存储过程。但是,存储过程不做任何更新(只是选择),它使用快照隔离级别。我将尝试模拟死锁,看看这是否模拟了问题。谢谢。
标签: stored-procedures sql-server-2012 ado.net