2009-06-05 29 views

回答

4

如果你看一下設計器生成的代碼,你會看到,如果有一個連接,適配器重複使用它,否則它會創建一個新的。在執行查詢方法時,如果連接未打開,該方法將打開它。如果該方法打開它,它會在完成時關閉它。默認情況下,您會爲每個表格適配器獲得一個新連接。

0

啊,TableAdapter的是保持連接打開,如果你面前打開了它,並傳遞給適配器,開放和Closa的適配器,如果你通過關閉的連接,或保留默認conenction

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

至於連接壽命,如果沒有打開,它會爲你打開和關閉它。

+0

我認爲他在談論設計器生成的表適配器,而不是SqlDataAdapters。 – tvanfosson 2009-06-05 15:27:21

+0

呸,我沒有從這個問題,但所選擇的答案,看來你是對的。 – JasonRShaver 2009-06-05 16:08:43

1

下面是一個典型設計器生成的表適配器的功能的代碼:

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

時會發生什麼

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

連接是否開放?還是關閉?