当我尝试对从数据库收到的数据执行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();
}
}
提前感谢您的帮助。
克莱尔
答案 0 :(得分:1)
您显示的代码很好。我把它带入了一个测试项目,它的工作原理。目前还不清楚为什么你会用上面显示的代码得到这条消息。这里有一些调试技巧/建议。我希望它们对你有价值。
在while (dataReader.Read())
上创建一个断点。在输入其代码块之前,请在立即或观察窗口中输入:dataReader.HasRows
。这应该评估为真。
在Read()
停止后,打开“本地”窗口以检查dataReader
的所有属性。确保FieldCount符合您对SELECT
声明的期望。
当进入此Read()
次迭代时,是否会创建学生对象? dataReader["StructureID"]
和立即窗口中所有其他人的价值是什么?
导致问题的不是CommandBehavior.CloseConnection
。这只是告诉连接在关闭datareader时也会自行关闭。
答案 1 :(得分:1)
当您使用C#中的Using,在使用后的最后一次}之后,Connection会自动关闭,这就是为什么当你试图读取他时,你为什么要关闭fieldcount,因为这是不可能的,因为你想要那些数据,在关闭使用之前阅读,或者你可以通过不使用(使用)
手动打开和关闭连接答案 2 :(得分:0)
当我收到该错误时,它恰好是命令超时问题(我正在阅读一些大型二进制数据)。作为第一次尝试,我增加了命令超时(不是连接超时!),问题解决了。 注意:在尝试找出问题时,我试图听取(Sql)连接的StateChanged事件,但事实证明连接永远不会处于“损坏”状态。
答案 3 :(得分:0)
这里有同样的问题。测试了以上所有解决方案
这是代码
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
的Closed = False
答案 4 :(得分:0)
在使用VS.NET调试器并尝试检查一些IQueryable结果时遇到了此异常。错误的决定,因为IQueryable导致大表扫描。解决方法是停止并重新启动调试器,而不尝试预览此特定的IQueryable。