设计器生成的表适配器如何处理连接

时间:2009-06-05 15:06:24

标签: .net database-connection tableadapter

表适配器如何使用连接?

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

此致

5 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

以下是典型设计器生成的表适配器函数的代码:

[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之前连接已打开,则它将保持打开状态。

参考:Fill Method (DataTable)

但是,在设计器生成的插入/删除/更新中,代码如下所示:

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

答案 2 :(得分:0)

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

答案 3 :(得分: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);
}

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

答案 4 :(得分:0)

时会发生什么
Dim Dt As dataset1.UsersDataTable
With New dataset1TableAdapters.UsersTableAdapter
   Dt = .GetData()
End With

连接是否打开?还是它关闭了?