为什么我需要在using块中使用odbcconnection.open

时间:2014-01-29 15:02:35

标签: c# ms-access ado.net odbc

我正在创建一个应用程序,我连接到Access数据库并执行多个更新。由于我不是数据库程序员,因此这也是一种学习体验。我在网上找到了以下代码,但在添加connection.open()行之前它没有用。

所以这是我的问题。我认为,就像在其他使用案例中创建文件一样,它会自动打开连接,然后在最后}处置。为什么我必须在创建新连接后显式调出open命令?

private static void GetAllTableAndColumnNames(string connectionString)
{
    using (OdbcConnection connection =
        new OdbcConnection(connectionString))
    {
        connection.Open();
        DataTable tables = connection.GetSchema("Tables");
        DataTable columns = connection.GetSchema("Columns");

        foreach (DataRow row in columns.Rows)
        {
            Console.WriteLine(row["COLUMN_NAME"].ToString());
            Console.WriteLine(row["TABLE_NAME"].ToString());
        }
        Console.Read();
    }
}

这是我在没有open命令的情况下在运行时获得的错误。

System.Data.dll中发生未处理的“System.InvalidOperationException”类型异常 附加信息:无效的操作。连接已关闭。

2 个答案:

答案 0 :(得分:1)

当代码到达using块的末尾并且它知道Connection对象即将被销毁时,通过确保正确关闭连接,“帮到你”。这是因为简单地在不通知服务器的情况下销毁Connection对象将是不重要的:服务器连接通常是宝贵的商品,并且在服务器上保持孤立连接“打开”将是一件坏事。

另一方面,在创建Connection对象时自动打开连接(即using语句本身)不一定是好事。也许您想要创建Connection对象,然后创建一大堆依赖于Connection对象的其他对象(例如,Command,DataAdapter等)。在这种情况下,连接是否确实需要打开?如果没有,那么如果连接到繁忙的服务器,那么连接打开整个时间也可能是不重要的。

或者,换句话说,有一个非常合理的理由可以解释为什么Connection对象可能会在“open”和“closed”之间切换状态,但是它应该在它消亡时应该处于唯一状态。 “关闭”。这就是为什么存在“自动关闭”行为而不是相应的“自动关闭”行为。

答案 1 :(得分:0)

使用子句旨在在变量超出范围时关闭自动资源。构造函数中的行为取决于实现:DbConnection后代不会在构造函数中打开该连接。

我认为这是因为构造函数重载:一些重载不带参数,所以无法打开数据库。