如何设计器生成的表适配器处理连接
问题描述:
答
如果你看一下设计器生成的代码,你会看到,如果有一个连接,适配器重复使用它,否则它会创建一个新的。在执行查询方法时,如果连接未打开,该方法将打开它。如果该方法打开它,它会在完成时关闭它。默认情况下,您会为每个表格适配器获得一个新连接。
答
啊,TableAdapter的是保持连接打开,如果你面前打开了它,并传递给适配器,开放和Closa的适配器,如果你通过关闭的连接,或保留默认conenction
答
你可以做它是这样的:
using (var MyConnection = new SqlConnection("Connection String Here"))
{
var MyDataAdapter = new SqlDataAdapter("Select * from [stuff]", MyConnection);
MyDataAdapter.Fill(MyDataSet);
}
或
using (var MyConnection = new SqlConnection("Connection String Here"))
{
var MyDataAdapter = new SqlDataAdapter();
var SelectCommand = MyConnection.CreateCommand();
SelectCommand.CommandText = "select * from [stuff]";
MyDataAdapter.SelectCommand = SelectCommand;
MyDataAdapter.Fill(MyDataSet);
}
至于连接寿命,如果没有打开,它会为你打开和关闭它。
答
下面是一个典型设计器生成的表适配器的功能的代码:
根据MSDN,DbDataAdapter.Fill
这样的表现:
Fill方法使用从数据源中检索行由关联的SelectCommand属性指定的SELECT语句。与SELECT语句关联的连接对象必须是有效的,但不需要打开。如果连接在调用Fill之前关闭,则会打开它以检索数据,然后关闭。如果连接在调用Fill之前打开,则它保持打开状态。
然而,在设计器生成的插入/删除/更新,代码应该是这样的:
global::System.Data.ConnectionState previousConnectionState = this.Adapter.InsertCommand.Connection.State;
if (((this.Adapter.InsertCommand.Connection.State & global::System.Data.ConnectionState.Open)
!= global::System.Data.ConnectionState.Open)) {
this.Adapter.InsertCommand.Connection.Open();
}
try {
int returnValue = this.Adapter.InsertCommand.ExecuteNonQuery();
return returnValue;
}
finally {
if ((previousConnectionState == global::System.Data.ConnectionState.Closed)) {
this.Adapter.InsertCommand.Connection.Close();
}
}
答
时会发生什么
Dim Dt As dataset1.UsersDataTable
With New dataset1TableAdapters.UsersTableAdapter
Dt = .GetData()
End With
连接是否开放?还是关闭?
我认为他在谈论设计器生成的表适配器,而不是SqlDataAdapters。 – tvanfosson 2009-06-05 15:27:21
呸,我没有从这个问题,但所选择的答案,看来你是对的。 – JasonRShaver 2009-06-05 16:08:43