阅读器关闭时调用 FieldCount 的尝试无效
-
27-09-2019 - |
题
当我尝试对从数据库收到的数据执行 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
. 。这应该评估为 true。虽然停在那
Read()
, ,打开本地窗口以检查所有属性dataReader
. 。确保 FieldCount 符合您的预期SELECT
陈述。当踏入这一步时
Read()
迭代,是否创建了学生对象?有什么价值dataReader["StructureID"]
以及立即窗口中的所有其他内容?
这不是 CommandBehavior.CloseConnection
导致问题。这只是告诉连接在您关闭数据读取器时也自行关闭。
其他提示
当您使用在C#中使用,后终于}从使用,连接自动关闭,为什么你段计数这就是被关闭时ü试图读懂他,因为这是不可能的,因为ü希望这些DATAS ,然后读之前关闭使用,或U可以通过不使用(使用)
打开和关闭手动连接,当我得到的错误时,它正好是一个命令超时问题(我正在读一些大的二进制数据)。作为第一次尝试,我增加了命令超时(未连接超时!),问题就解决了。 注:试图找出问题,我试着听(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