【问题标题】:Do I need to close OleDbDataReader everytime I use it?每次使用 OleDbDataReader 时都需要关闭它吗?
【发布时间】:2013-05-31 17:39:34
【问题描述】:

我在我的 c# 项目中使用 OleDbDataReader 类,我的程序在运行后一直锁定我的 mdb 文件。我想知道如何在最后可靠地关闭连接以释放锁。如果我每次运行查询时都需要关闭它,或者我可以在程序结束时一次性完成所有操作。这是我的设置方式:

private OleDbConnection myDbC = new OleDbConnection(connectionString);
myDbC.Open();

这是我多次使用它的方式:

OleDbCommand cmd = new OleDbCommand(SQL, myDbC);
OleDbDataReader reader = cmd.ExecuteReader();
reader.Close();

程序结束后,我还执行以下操作:

myDbC .Close();

所以这以某种方式锁定了 mdb 文件。有什么帮助吗?

【问题讨论】:

标签: c# ms-access oledb ole


【解决方案1】:

始终.Close() 连接是一个好习惯。不要依靠垃圾收集器来为你做这件事。在某些情况下,连接会自动为您关闭;就像使用 SqlDataAdapter 及其 .Fill() 方法时一样。但这并没有改变您应该在代码中管理连接的事实

话虽如此,最好使用using statement 来实现,如下所示:

using(OleDbConnection oledbConn = new OleDbConnection())
{
   oledbConn.Open();       
}

您还可以嵌套这些 using 语句、包装命令对象甚至数据适配器:

using(OleDbConnection oleDbConn = new OleDbConnection())
{
   oleDbConn.Open(); 
   using (OleDbCommand oleDbCmd = new OleDbCommand())
   {
      using (OleDbDataAdapter oleDbAdapter = new OleDbDataAdapter())
      {
         //More code can go here.
      }
   }
   oleDbConn.Close();      
}

【讨论】:

  • 有什么办法可以在最后强制关闭连接吗?
  • 是的。在您的连接对象上调用.Close() 方法。请参阅上面的代码更正。
【解决方案2】:

我建议你使用 using 关键字。因为有时您可能会忘记关闭或配置连接和阅读器。因为使用会自动处理对象。 Using 语句告诉 .NET 在不再需要时释放 using 块中指定的对象。

using (OleDbConnection conn = /* Create new instance using your favorite method */)
{
    conn.Open();
    using (OleDbCommand command = /* Create new instance using your favorite method */)
    {
        using (OleDbDataReader dr = cmd.ExecuteReader())
        { 
            while (dr.Read()) 
            { 
                //read here 
            } 
       } 
    }
    conn.Close(); // Optional
}

来自MSDN的更多详情:

C#,通过 .NET Framework 公共语言运行时 (CLR), 自动释放用于存储对象的内存 需要更长的时间。内存的释放是不确定的;记忆是 当 CLR 决定执行垃圾回收时释放。 但是,通常最好释放有限的资源,例如文件 尽快处理和网络连接。

using 语句允许程序员指定什么时候对象 使用资源应该释放它们。提供给使用对象 语句必须实现 IDisposable 接口。这个界面 提供 Dispose 方法,该方法应该释放对象的 资源。

【讨论】:

  • 无论如何我可以强制连接在最后关闭吗?
  • @YongkeBillYu OleDbConnection 现在正在使用 statemnet。所以它将100%关闭。但是你可以像我的例子一样在最后调用 conn.Close()。
  • 看到我已经在数据库上调用了 Close,但它似乎仍然在锁定它,除非我重新启动我的程序。
  • @YongkeBillYu 像我的例子一样更新你的代码。然后用 conn.State 获取你的连接状态,它无法打开。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-24
  • 1970-01-01
  • 1970-01-01
  • 2019-08-15
  • 1970-01-01
  • 1970-01-01
  • 2021-12-11
相关资源
最近更新 更多