4

我正在审查应用程序中的一段代码,并且在连接到数据库方面遇到了一些非常奇怪的事情。

它在不打开连接的情况下执行查询,如下所示:

using (sqlConnection1 = new SqlConnection(connString)
{
    SqlCommand comm = new SqlCommand(query,sqlConnection1);

    // ... parameters are handled here...

    SqlDataAdapter ad = new SqlDataAdapter(comm);
    ds = new DataSet();
    ad.FillSchema(ds, SchemaType.Source);
    ad.Fill(ds);
}

它不应该因为连接未打开而失败吗?我实际上在单独的项目中对此进行了测试并且它有效。

4

4 回答 4

8

如果连接关闭,使用 SqlDataAdapter.Fill 将打开连接 http://msdn.microsoft.com/en-us/library/377a8x4t.aspx

于 2013-09-09T12:47:12.517 回答
3

根据文档,如果连接尚未打开,SqlDataAdapter 将打开它,并将其返回到之前的状态。

与 SelectCommand 关联的连接对象必须有效,但不需要打开。如果在调用 FillSchema 之前关闭连接,则打开它以检索数据,然后关闭。如果在调用 FillSchema 之前连接已打开,则它保持打开状态。

Fill也以相同的方式表现

于 2013-09-09T12:47:58.473 回答
3

参考MSDN

如果发现连接尚未打开,Fill 方法会隐式打开 DataAdapter 正在使用的连接。如果 Fill 打开了连接,Fill 完成后它也会关闭连接。在处理诸如填充或更新之类的单个操作时,这可以简化您的代码。

这意味着在da.Fill(ds, "Test");您的连接被方法本身关闭之后。但是您需要为以下更新打开它(并且失败)

于 2013-09-09T12:51:50.277 回答
1

SqlDataAdapter.Fill方法;

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

方法也FillSchema做同样的事情。

于 2013-09-09T12:48:38.730 回答