2

我在我的 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 文件。有什么帮助吗?

4

2 回答 2

1

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

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

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();      
}
于 2013-05-31T17:52:36.060 回答
1

我建议你使用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 语句允许程序员指定使用资源的对象何时应该释放它们。提供给 using 语句的对象必须实现 IDisposable 接口。该接口提供了 Dispose 方法,该方法应该释放对象的资源。

于 2013-05-31T17:41:19.123 回答