当我尝试执行dataReader.Read从数据库中接收到的数据时,会发生上述错误。我知道那里有两行,所以没有,因为实际上没有数据。
是不是CommandBehavior.CloseConnection,导致了问题?有人告诉我必须在ExecuteReader之后立即执行此操作?这是正确的吗?
try
{
_connection.Open();
using (_connection)
{
SqlCommand command = new SqlCommand("SELECT * FROM Structure", _connection);
SqlDataReader dataReader = command.ExecuteReader(CommandBehavior.CloseConnection);
if (dataReader == null) return null;
var newData = new List<Structure>();
while (dataReader.Read())
{
var entity = new Structure
{
Id = (int)dataReader["StructureID"],
Path = (string)dataReader["Path"],
PathLevel = (string)dataReader["PathLevel"],
Description = (string)dataReader["Description"]
};
newData.Add(entity);
}
dataReader.Close();
return newData;
}
}
catch (SqlException ex)
{
AddError(new ErrorModel("An SqlException error has occured whilst trying to return descendants", ErrorHelper.ErrorTypes.Critical, ex));
return null;
}
catch (Exception ex)
{
AddError(new ErrorModel("An error has occured whilst trying to return descendants", ErrorHelper.ErrorTypes.Critical, ex));
return null;
}
finally
{
_connection.Close();
}
}
提前感谢您的帮助。
克莱尔
您显示的代码很好。我已经将其带入一个测试项目,并且可以正常工作。目前尚不清楚为什么使用上面显示的代码会收到此消息。以下是一些调试技巧/建议。我希望它们对您有价值。
在while (dataReader.Read())
上创建一个断点。在进入其代码块之前,请在“立即”或“监视”窗口中输入以下代码:dataReader.HasRows
。那应该为真。
虽然在Read()
上停止,请打开“本地”窗口以检查dataReader
的所有属性。确保FieldCount是您从SELECT
语句中期望的值。
进入此Read()
迭代时,是否完全创建了学生对象? dataReader["StructureID"]
和“即时窗口”中所有其他值是什么?
不是引起问题的CommandBehavior.CloseConnection
。这只是告诉您在关闭数据读取器时连接也会自行关闭。
[当您使用C#中的using时,最后一个}之后,Connection会自动关闭,这就是为什么您尝试读取他时要关闭fieldcount的原因,这是不可能的,因为您想要这些数据,请先阅读,然后再关闭使用方式,或者您可以通过不使用(使用方式)来手动打开和关闭连接]
当我收到该错误时,它恰好是命令超时问题(我正在读取一些大的二进制数据)。第一次尝试,我增加了命令超时(而不是连接超时!),问题就解决了。注意:在尝试找出问题时,我尝试监听(Sql)连接的StateChanged事件,但事实证明该连接从未处于“断开”状态。
这里有同样的问题。测试了以上所有解决方案
这里是代码
1 objCmd.Connection.Open()
2 objCmd.CommandTimeout = 3000
3 Dim objReader As OleDbDataReader = objCmd.ExecuteReader()
4 repeater.DataSource = objReader
5 CType(repeater, Control).DataBind()
6 objReader.Close()
7 objCmd.Connection.Dispose()
此外,在第4行objReader
已关闭= False
我在使用VS.NET调试器并尝试检查一些IQueryable结果时遇到了此异常。错误的决定,因为IQueryable导致大表扫描。解决方法是停止并重新启动调试器,而不尝试预览此特定的IQueryable。