2

当我在 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();

但是,如果我想执行诸如 a 之类的非查询,INSERT INTO或者UPDATE为什么我必须使用 ? 显式打开连接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();
4

3 回答 3

3

来自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();
于 2012-05-16T14:25:08.550 回答
3

那是因为 aDataAdapter在最初关闭时会隐式打开连接。如果之前关闭,它将在之后关闭它,否则连接保持打开状态。

来自MSDN

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

使用 a 时,SqlCommand您必须自己明确地打开和关闭连接。

作为旁注

  1. 使用参数避免 SQL 注入
  2. 对任何实现使用using 语句IDisposable,尤其是 Connections,因为它确保它尽快被处理/关闭,即使在出现错误的情况下也是如此
于 2012-05-16T14:25:30.060 回答
2

该文件指出

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

在这里查看更多信息。

于 2012-05-16T14:26:06.147 回答