我创建了以下方法:
public System.Data.OleDb.OleDbDataReader GetReader(string sqlQuery)
{
System.Data.OleDb.OleDbConnection myConnection = new System.Data.OleDb.OleDbConnection();
LoadConnectionStrings();
myConnection.ConnectionString = ConnectionString;
myConnection.Open();
System.Data.OleDb.OleDbCommand myCommand = new System.Data.OleDb.OleDbCommand(sqlQuery, myConnection);
System.Data.OleDb.OleDbDataReader myReader = null;
myReader = myCommand.ExecuteReader();
return myReader;
}
几千行代码依赖它,我想我实际上并没有真正想到它......
反正,.如果我以这种方式检索读者我无法关闭连接,如果我在读取器调用read()方法之前关闭连接,它会在读取时爆炸并说出与数据库的连接需要开放。
问题是,如何关闭以前代码体的连接?或者通常所有的连接都可以..
从我读过的here开始,如果你没有专门调用'close()'那么它就不会被关闭,如果你使用的是访问2003文件,它会让你进入受伤的世界
答案 0 :(得分:12)
在这种情况下,连接需要保持打开状态以便阅读器工作 - 但是,ExecuteReader会出现过载,允许您为阅读器指定一个标志,以便在阅读器关闭时关闭连接:
myReader = myCommand.ExecuteReader(CommandBehavior.CloseConnection);
这允许呼叫者使用:
using(var reader = GetReader(query)) {
//...
}
当调用者完成阅读器时,连接将完全关闭。
答案 1 :(得分:1)
不确定它是否完全解决了您的问题,但您可以使用IDBcommand.ExecuteReader(CommandBehavior)重载。
如果您将CommandBehavior.CloseConnection
传递给它,那么当您的阅读器关闭时,数据库连接将会关闭。
答案 2 :(得分:1)
我同意Marc,但是想指出你的方法存在缺陷。
此机制隐藏了来自调用者的连接,因此调用者无法将其用于针对数据库的其他操作。它还限制了与读者生命周期的连接,因此如果采取任何其他行动,则必须在处理读者之前进行。
让调用者控制连接可能会更好,只需将连接传递给GetReader方法。
答案 3 :(得分:1)
我使用类似的东西:
IDataReader GetReader(...)
{
IDbConnection connection = ...;
try
{
IDbCommand command = ...;
command.Connection = connection;
connection.Open();
return command.ExecuteReader(CommandBehavior.CloseConnection);
}
catch
{
connection.Close();
throw;
}
}
这不会关闭IDbCommand
,但根据我的经验,只要关闭连接就可以了。