表适配器如何使用连接?
稍微解释一下,他们是否会自动打开和关闭连接,或者如果我在调用 tableadapter 方法之前已经打开了连接,他们是否使用它并保持打开状态?
问候
表适配器如何使用连接?
稍微解释一下,他们是否会自动打开和关闭连接,或者如果我在调用 tableadapter 方法之前已经打开了连接,他们是否使用它并保持打开状态?
问候
如果您查看设计器生成的代码,您会发现如果存在连接,适配器会重用它,否则它会创建一个新连接。执行查询方法时,如果连接未打开,则该方法将其打开。如果方法打开了它,它会在完成后关闭它。默认情况下,您会为每个表适配器获得一个新连接。
下面是一个典型的设计器生成的 Table Adapter 函数的代码:
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.ComponentModel.Design.HelpKeywordAttribute("vs.data.TableAdapter")]
[global::System.ComponentModel.DataObjectMethodAttribute(global::System.ComponentModel.DataObjectMethodType.Select, true)]
public virtual Styles.OrdersDataTable GetOrders() {
this.Adapter.SelectCommand = this.CommandCollection[0];
Styles.OrdersDataTable dataTable = new Styles.OrdersDataTable();
this.Adapter.Fill(dataTable);
return dataTable;
}
根据 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();
}
}
是的,tableadapter 如果您之前打开它并传递给适配器,则保持连接打开,如果您通过关闭连接,则打开并关闭适配器,或者保留默认连接
你可以这样做:
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);
}
至于连接寿命,如果没有打开,它会为你打开和关闭它。
什么时候发生
Dim Dt As dataset1.UsersDataTable
With New dataset1TableAdapters.UsersTableAdapter
Dt = .GetData()
End With
连接是否保持打开状态?还是关闭了?