为什么一个连接不得不打开,而不是填充数据集?

当我连接到C#应用程序中的SQL数据源时,可以使用以下代码填充数据集。 请注意,我不明确打开到数据源的连接。

SqlConnection cw_con = new SqlConnection("Server=Server;Database=Database;User=User;password=password"); SqlCommand cmd = new SqlCommand("SELECT * FROM Example WHERE value = value"); cmd.Connection = cw_con; //Create DataSet DataSet cw_ds = new DataSet("cw_ds"); SqlDataAdapter da = new SqlDataAdapter(); da.SelectCommand = cmd; //Execute Command and Fill DataSet da.Fill(cw_ds); cw_ds.Clear(); 

但是,如果我想执行一个非查询如INSERT INTOUPDATE为什么我必须使用connection.Open();显式打开连接connection.Open();

 SqlConnection cw_con = new SqlConnection("Server=Server;Database=Database;User=User;password=password"); cw_con.Open(); SqlCommand cmd = new SqlCommand("UPDATE example SET value = value WHERE value = value"); cmd.Connection = cw_con; cmd.ExecuteNonQuery(); cw_con.Close(); 

这是因为DataAdapter最初关闭时会隐式打开连接。 之后关闭,否则连接保持打开状态。

来自MSDN :

Fill方法使用SELECT语句从数据源中检索数据。 与select命令关联的IDbConnection对象必须是有效的,但不需要打开。 如果IDbConnection在调用Fill之前关闭,则会打开它以检索数据,然后关闭。 如果连接在调用Fill之前打开,它将保持打开状态。

当使用SqlCommand你必须自己打开和关闭连接。

作为一个方面说明

  1. 使用参数来避免SQL注入
  2. 使用using语句来实现IDisposable ,尤其是Connections,因为它可以确保尽快处理/关闭,即使在出错的情况下

从DataAdapter.Fill文档

如果连接在调用Fill之前关闭,则会打开它以检索数据,然后关闭。 如果连接在调用Fill之前打开,它将保持打开状态。

当您使用SqlCommand时,您使用的是较低级别的类,因此您需要自己管理连接。

这里有一个用例,你不希望连接被自动打开,因为它会被打开和关闭好几次,而且更好地抛出异常

 SqlCommand InsertCmd = new ("Insert statement", cw_con) cw_con.Open(); foreach (var newitem in collection) { --Set Parameters UpdateCmd.ExecuteNonQuery(); } cw_con.Close(); 

该文件指出

Fill方法使用由关联的SelectCommand属性指定的SELECT语句从数据源中检索行。 与SELECT语句关联的连接对象必须是有效的,但不需要打开。 如果连接在调用Fill之前关闭,则会打开它以检索数据,然后关闭。 如果连接在调用Fill之前打开,它将保持打开状态。

在这里寻找更多的信息。