我有一个连接到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();
}
如何使用调用相同连接并关闭它的函数关闭现有连接
如何测试连接是否已关闭?
答案 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会有很大的帮助。通过这种方式,当您不需要它时,您不会保留全局物体。