【问题标题】:OleDbConnection: How to open and close a connection using a functionOleDbConnection:如何使用函数打开和关闭连接
【发布时间】:2017-12-11 16:10:07
【问题描述】:

我有一个连接到 Excel 文件的函数:

    public OleDbConnection connection;

    public void eConnection(string srcString, string id)
    {
        conString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + srcString + "; Extended Properties='Excel 8.0;HDR=Yes;IMEX=1'";
        connection = new OleDbConnection(conString);
        connection.Open();

    } 

我想创建另一个函数,在调用或调用时将关闭此现有连接

这是我必须尝试关闭现有连接的方法:

    public void eCloseConnection()
    {
        connection.Close();
    }

如何使用调用相同连接并关闭它的函数关闭现有连接

如何测试连接是否关闭?

【问题讨论】:

  • 这是否意味着您拥有的不仅仅是连接字符串?您拥有的代码只有一个连接,并且只会关闭最新的连接。

标签: c# database-connection oledb oledbconnection


【解决方案1】:

不要这样。 OleDbConnection 实现了 IDisposable 接口,应该在你使用完后立即释放它,最好的方法是将其用作在 using 语句中声明的局部变量:

public void DoStuffWithExcel(string srcString)
{
    conString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + srcString + "; Extended Properties='Excel 8.0;HDR=Yes;IMEX=1'";
    using(var connection = new OleDbConnection(conString))
    {
        connection.Open();
        // do your stuff here...
    }
}

using 语句确保即使在 using 块内发生异常,连接也会被正确处理。
这种方式是防止内存泄漏以及使用连接池的最佳方式。

来自微软文档页面OLE DB, ODBC, and Oracle Connection Pooling

我们建议您在使用完连接后始终关闭或释放连接,以便将连接返回到池中。未明确关闭的连接可能不会返回到池中。例如,超出范围但未显式关闭的连接只有在达到最大池大小且连接仍然有效时才会返回到连接池。

【讨论】:

    【解决方案2】:

    不要将连接的全局对象隐藏在类中。这增加了比解决的问题更多的问题。您应该跟踪该代码被调用的次数以及它创建了多少连接。当然,这使得结束部分变得更加复杂。

    相反,C# 语言为此类问题提供了更好的方法。这种方法特别适用于需要尽快将非托管资源释放给操作系统的连接等对象。

    如果您想要一个类来处理您的连接,或者您只想打开并使用一个连接,您应该使用这种方法

    public static class DbUtility
    {
        public static OleDbConnection eConnection(string srcString)
        {
            conString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + srcString + "; Extended Properties='Excel 8.0;HDR=Yes;IMEX=1'";
            connection = new OleDbConnection(conString);
            connection.Open();
            return connection;
        } 
        .... other static utilities
    }
    

    现在你可以用这种方式使用你的类了

    string srcFile = @"d:\temp\myFile.xlsx";
    using(OleDbConnection cn = DbUtility.eConnection(srcFile))
    {
         .. use your connection
    
    } // <- at this point your connection is automatically closed and disposed.
    

    using keyword 在您需要像连接一样销毁一次性对象时非常有用。这样,当您不需要它时,您就不会保留全局对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-31
      • 2017-02-01
      • 1970-01-01
      • 2018-10-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多