如何在呼叫者完成后关闭我的连接?

时间:2012-03-16 16:47:54

标签: c# database connection oledb


我创建了以下方法:

 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文件,它会让你进入受伤的世界

4 个答案:

答案 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,但根据我的经验,只要关闭连接就可以了。