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

问题描述:

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

要解释一下,做自己自动打开和关闭连接,或者如果我已经有调用一个TableAdapter方法之前打开的连接,他们使用它,离开它打开?

问候

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

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

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

+0

我认为他在谈论设计器生成的表适配器,而不是SqlDataAdapters。 – tvanfosson 2009-06-05 15:27:21

+0

呸,我没有从这个问题,但所选择的答案,看来你是对的。 – JasonRShaver 2009-06-05 16:08:43

下面是一个典型设计器生成的表适配器的功能的代码:

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

时会发生什么

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

连接是否开放?还是关闭?