Как сгенерированные дизайнером адаптеры таблиц обрабатывают соединения - PullRequest
2 голосов
/ 05 июня 2009

Как настольные адаптеры используют соединения?

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

Привет

Ответы [ 5 ]

4 голосов
/ 05 июня 2009

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

1 голос
/ 05 июня 2009

Вот код типичной сгенерированной дизайнером функции 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 извлекает строки из источника данных, используя инструкцию SELECT, указанную связанным свойством SelectCommand. Объект соединения, связанный с оператором SELECT, должен быть действительным, но его не нужно открывать. Если соединение закрывается до вызова Fill, оно открывается для извлечения данных, а затем закрывается. Если соединение открыто до вызова Fill, оно остается открытым.

Ссылка: Метод заполнения (DataTable)

Однако в сгенерированном дизайнером Insert / Delete / Update код будет выглядеть так:

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 голосов
/ 28 декабря 2010

Что происходит, когда

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

Соединение оставлено открытым? или оно закрыто?

0 голосов
/ 05 июня 2009

Вы можете сделать это так:

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 голосов
/ 05 июня 2009

да, tableadapter оставит соединение открытым, если вы открыли его ранее и передали адаптеру, и откройте и закройте адаптер, если вы передадите закрытое соединение, или оставите соединение по умолчанию

...