OleDbConnection:如何使用函数打开和关闭连接

时间:2017-12-11 16:10:08

标签: c# database-connection oledb oledbconnection

我有一个连接到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();
    }

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

如何测试连接是否已关闭?

2 个答案:

答案 0 :(得分:2)

不要这样做。 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块内发生异常,也会正确处理连接。
这种方式是防止内存泄漏以及使用连接池的最佳方法。

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

  

我们建议您在完成连接后始终关闭或丢弃连接,以便将连接返回到池中。未显式关闭的连接可能无法返回池。例如,如果已达到最大池大小且连接仍然有效,则超出范围但尚未显式关闭的连接将仅返回到连接池。

答案 1 :(得分:1)

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

相反,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会有很大的帮助。通过这种方式,当您不需要它时,您不会保留全局物体。

相关问题