Оператор USING и соединение TableAdapters - PullRequest
0 голосов
/ 09 ноября 2011

Мне нужна помощь в правильной реализации оператора USING со строго типизированными TableAdapters

У меня есть что-то вроде этого:

Using myDT As New mbr_Account.mbr_AccountDataTable
     Using myTA As New mbr_AccountTableAdapters.mbr_AccountTableAdapter
           myTA.Connection.Open()
           myTA.Fill(myDT)
           myTA.Connection.Close()
     End Using

     For Each row In myDT
          'do stuff
     Next
End Using

Это правильно избавится от datatable и tableadapter, но нерешить проблему объекта подключения.

Как мне избавиться от объекта подключения?

Я мог бы обернуть соединение в Try ... Наконец, вот так:

Using myDT As New mbr_Account.mbr_AccountDataTable
    Using myTA As New mbr_AccountTableAdapters.mbr_AccountTableAdapter
        Try
            myTA.Connection.Open()
            myTA.Fill(myDT)
        Finally
            If Not IsNothing(myTA.Connection) Then
                myTA.Connection.Close()
                myTA.Connection.Dispose()
            End If
        End Try
    End Using

    For Each row In myDT
        'do stuff
    Next
End Using

Вопрос: Как использовать ключевое слово USING вместо Try .. Наконец, для объекта подключения?

Ответы [ 2 ]

0 голосов
/ 09 ноября 2011

Я только что узнал, что адаптеры таблиц автоматически открывают и закрывают соединения, и нет необходимости добавлять код вручную.

По сути, они уже содержат блоки Try ... finally для обработки закрытия соединений во время исключений.

Сгенерированный дизайнером код вставки / удаления / обновления выглядит следующим образом:

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 голосов
/ 09 ноября 2011

По какой-либо причине вы не можете использовать DataReader таким образом?

Dim sql As String = "SELECT whatever FROM SomeTable"
Using myConnection As New SqlConnection(MyConnectionstring)
    Using myCommand As New SqlCommand(sql, myConnection)
        myConnection.Open()
        Using myReader As SqlDataReader = myCommand.ExecuteReader()
            Dim myTable As New DataTable()
            myTable.Load(myReader)
            myConnection.Close()
            Return myTable
        End Using
    End Using
End Using

Соединение будет закрыто и автоматически удалено.

...