【发布时间】:2009-06-05 15:06:24
【问题描述】:
表适配器如何使用连接?
稍微解释一下,他们是否会自动打开和关闭连接,或者如果我在调用 tableadapter 方法之前已经打开了连接,他们会使用它并保持打开状态吗?
问候
【问题讨论】:
标签: .net database-connection tableadapter
表适配器如何使用连接?
稍微解释一下,他们是否会自动打开和关闭连接,或者如果我在调用 tableadapter 方法之前已经打开了连接,他们会使用它并保持打开状态吗?
问候
【问题讨论】:
标签: .net database-connection tableadapter
如果您查看设计器生成的代码,您会发现如果存在连接,则适配器会重用它,否则它会创建一个新的。执行查询方法时,如果连接未打开,则该方法将其打开。如果方法打开了它,它会在完成后关闭它。默认情况下,您会为每个表适配器获得一个新连接。
【讨论】:
这是一个典型的设计师生成的表格适配器的功能代码:
[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并传递给适配器,则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
连接是否保持打开状态?还是关门了?
【讨论】: