我有这段代码:
// this is managed elsewhere
SqlConnection connection =...
connection.Open();
// this is one block of code, separate from the above
using( var transaction = connection.BeginTransaction() ) {
using( var command = connection.CreateCommand() ) {
command.Transaction = transaction;
command.CommandText = ...
using( var reader = command.ExecuteReader() ) {
if( reader.HasRows ) {
if( reader.Read() ) {
//get data from the reader
}
}
}
}
这个代码大部分时间运行得很好。但有时 - 很少 - 检索HasRows
会产生以下异常:
Invalid attempt to call HasRows when reader is closed.
System.InvalidOperationException
at System.Data.SqlClient.SqlDataReader.get_HasRows()
// my code calling HasRows listed here
我99.5%肯定在那一刻连接是开放的。在阅读阅读器pretty much like MSDN suggests之前,我的代码使用了HasRows
。
该例外的原因可能是什么?
答案 0 :(得分:3)
这恰好是unexpected behavior in ExecuteReader()
- 很可能是一个错误。内部ExecuteReader()
内部发生了一些随机错误,很可能是网络超时,连接已关闭,然后返回关闭的SqlDataReader
,就好像什么也没发生一样。难怪随后对HasRows
的调用会产生异常。
答案 1 :(得分:2)
的quickfix 您可以添加一个检查以确定您的连接是否在离开之前打开,如果已关闭则再次打开您的连接
但我建议您在那里添加不错的日志(我很好奇;))
答案 2 :(得分:1)
我担心您上面的评论,每次都没有创建连接。让连接池担心开销。您应该每次都创建一个连接。创建连接,执行读取,销毁连接。长期存在的连接可能会在服务器之间丢弃通信时出现间歇性问题(只需要超时或少量丢弃数据包)。
答案 3 :(得分:0)
您是否在任何地方声明了DataReader ????
此外,如果你有BeginTransaction()函数,那么这个函数应该具有你想要执行什么类型的命令的功能,即executeReader,ExecuteNonQuery等。首先检查你的读者:
ISReading...
然后继续阅读.hasRow。
DataReader还存储一个完整的表,因此您应该检查Tables [0] .rows