用 C# 编写的相当大的 Web 应用程序不断抛出 2 个错误:
'ExecuteReader 需要一个开放且可用的连接。连接的当前状态是打开的。
和
“阅读器关闭时调用 Read 的尝试无效。”
这些错误是零星的——过去页面在大约 95% 的情况下加载良好,但最近它们变得普遍,它们一直在发生,基本上削弱了应用程序的功能。
该 Web 应用程序高度依赖 MS SQL 数据库,并且错误似乎不仅仅局限于一个页面,而是几乎所有连接到数据库的页面。
查询的执行方式如下:
Database.Open(); // Custom class that has our connection string hard coded.
string query = "SELECT * FROM table"; // (dummy query)
SqlCommand command = new SqlCommand(query, Database.Conn);
SqlDataReader reader = null;
try {
reader = command.ExecuteReader(CommandBehaviour.CloseConnection);
if (reader.HasRows) {
while (reader.Read()) {
// Do something with the data.
}
}
reader.Close();
}
catch (Exception e) {
throw new Exception(e.Message);
}
finally {
if (reader != null) {
reader.Close();
}
}
我在网上研究了这些错误,并看到了一些可能的解决方案,但我尝试过但无济于事:
将代码的各个部分放入 using() 块中。
为读取器指定 CommandBehaviour.CloseConnection。
检查 MARS 是否已启用。
确保每次都创建一个新的连接对象。
我花了很长时间寻找解决方案,更不用说花了很长时间试图让它发挥作用,而我现在几乎处于拔掉头发的边缘!
请帮忙!
编辑 - 修复了问题,请参阅评论部分。
在我看来Database
是一个类型而不是一个实例。
您现在遇到了多线程问题。
您有 2 个选择:
- 应用
[ThreadStatic]
到包含创建的连接对象的字段Database.Open()
or
- Make
Database.Open()
返回连接对象的新实例并在构造命令时使用它
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)