2009-06-05 4 views
2

Как адаптеры таблицы используют соединения?Как адаптеры таблицы, созданные дизайнером, обрабатывают соединения

Чтобы объяснить это, они автоматически открывают и закрывают соединения, или если я уже открываю соединение перед вызовом метода tableadapter, они используют его и оставляют открытым?

С уважением

ответ

4

Если вы посмотрите на код, созданный конструктором, вы увидите, что если есть соединение, адаптер повторно использует его, иначе он создает новый. При выполнении метода запроса, если соединение не открыто, метод открывает его. Если метод открыл его, он закрывает его, когда это будет сделано. По умолчанию вы получаете новое соединение для каждого адаптера таблицы.

+0

Будет ли он повторно использовать соединение через пул соединений, если в течение определенного периода времени? –

+0

Это ортогонально тому, как диспетчер соединений управляет пулом соединений. Поскольку он использует одну и ту же строку соединения (если вы не делаете что-то другое) каждый раз, они будут взяты из одного пула. Простой факт, что это адаптер таблицы, не изменяет способ обработки пулов. Если вам интересно, в MSDN есть статья, посвященная объединению, но она не специфична для адаптеров таблицы (и не обязательно): http://msdn.microsoft.com/en-us/library/8xx3tyca.aspx – tvanfosson

+0

Спасибо за ссылку. –

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

+0

Бах, я не понял этого вопроса, но по выбранному ответу кажется, что ты прав. – JasonRShaver

1

Вот код типичной функции конструктора-сгенерированной таблицы адаптера:

Согласно MSDN, DbDataAdapter.Fill ведут себя так:

Метод Fill получает строки из источника данных с использованием оператор SELECT, указанный соответствующим свойством SelectCommand. Объект соединения, связанный с оператором SELECT, должен быть действительным, но его не нужно открывать. Если соединение закрыто до вызова Fill, оно открывается для извлечения данных, а затем закрывается. Если соединение открыто до вызова Fill, оно остается открытым.

Ref: 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 

Открылась ли связь? или он закрыт?