当我连接到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 INTO
或UPDATE
为什么我必须使用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
你必须自己打开和关闭连接。
作为一个方面说明 :
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之前打开,它将保持打开状态。
在这里寻找更多的信息。