3

表适配器如何使用连接?

稍微解释一下,他们是否会自动打开和关闭连接,或者如果我在调用 tableadapter 方法之前已经打开了连接,他们是否使用它并保持打开状态?

问候

4

5 回答 5

5

如果您查看设计器生成的代码,您会发现如果存在连接,适配器会重用它,否则它会创建一个新连接。执行查询方法时,如果连接未打开,则该方法将其打开。如果方法打开了它,它会在完成后关闭它。默认情况下,您会为每个表适配器获得一个新连接。

于 2009-06-05T15:24:17.403 回答
1

下面是一个典型的设计器生成的 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();
            }
        }
于 2009-06-05T15:42:50.503 回答
0

是的,tableadapter 如果您之前打开它并传递给适配器,则保持连接打开,如果您通过关闭连接,则打开并关闭适配器,或者保留默认连接

于 2009-06-05T15:23:39.947 回答
0

你可以这样做:

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);
}

至于连接寿命,如果没有打开,它会为你打开和关闭它。

于 2009-06-05T15:23:54.550 回答
0

什么时候发生

Dim Dt As dataset1.UsersDataTable
With New dataset1TableAdapters.UsersTableAdapter
   Dt = .GetData()
End With

连接是否保持打开状态?还是关闭了?

于 2010-12-28T08:51:53.913 回答