我正在审查应用程序中的一段代码,并且在连接数据库时出现了一些非常奇怪的事情。
它正在执行查询而不打开这样的连接:
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);
}
由于连接未打开,它不能失败吗?我实际上在单独的项目中对此进行了测试,但它确实有效。
答案 0 :(得分:8)
如果连接已关闭,则使用SqlDataAdapter.Fill将打开连接 http://msdn.microsoft.com/en-us/library/377a8x4t.aspx
答案 1 :(得分:3)
Per the documentation,SqlDataAdapter将打开conenction(如果尚未打开),并将其恢复到之前的状态。
与SelectCommand关联的连接对象必须有效,但不需要打开。如果在调用FillSchema之前关闭连接,则会打开它以检索数据,然后关闭。如果在调用FillSchema之前连接已打开,则它将保持打开状态。
Fill
的行为方式也相同
答案 2 :(得分:3)
参考MSDN
Fill方法隐式打开DataAdapter的Connection 如果发现连接尚未打开,则使用。如果填写 打开连接,它也将在Fill时关闭连接 完了。这可以在处理单个代码时简化代码 填充或更新等操作。
这意味着在da.Fill(ds, "Test");
之后,您的连接被方法本身关闭。但是你需要打开以进行以下更新(并且失败)
答案 3 :(得分:1)
来自SqlDataAdapter.Fill
方法;
Fill方法使用SELECT从数据源中检索行 由关联的SelectCommand属性指定的语句。该 与SELECT语句关联的连接对象必须有效, 但不需要打开。如果在调用Fill之前关闭连接,则会打开它以检索数据,然后关闭。如果 在调用Fill之前连接已打开,它仍保持打开状态。
同样FillSchema
方法做同样的事情。