我正在创建一个应用程序,我连接到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”类型异常 附加信息:无效的操作。连接已关闭。
答案 0 :(得分:1)
当代码到达using
块的末尾并且它知道Connection对象即将被销毁时,通过确保正确关闭连接,“帮到你”。这是因为简单地在不通知服务器的情况下销毁Connection对象将是不重要的:服务器连接通常是宝贵的商品,并且在服务器上保持孤立连接“打开”将是一件坏事。
另一方面,在创建Connection对象时自动打开连接(即using
语句本身)不一定是好事。也许您想要创建Connection对象,然后创建一大堆依赖于Connection对象的其他对象(例如,Command,DataAdapter等)。在这种情况下,连接是否确实需要打开?如果没有,那么如果连接到繁忙的服务器,那么连接打开整个时间也可能是不重要的。
或者,换句话说,有一个非常合理的理由可以解释为什么Connection对象可能会在“open”和“closed”之间切换状态,但是它应该在它消亡时应该处于唯一状态。 “关闭”。这就是为什么存在“自动关闭”行为而不是相应的“自动关闭”行为。
答案 1 :(得分:0)
使用子句旨在在变量超出范围时关闭自动资源。构造函数中的行为取决于实现:DbConnection后代不会在构造函数中打开该连接。
我认为这是因为构造函数重载:一些重载不带参数,所以无法打开数据库。