ИСПОЛЬЗОВАНИЕ инструкции и подключения TableAdapters

#asp.net #sql-server #vb.net #tableadapter #vb.net-2010

#asp.net #sql-сервер #vb.net #tableadapter #vb.net-2010

Вопрос:

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

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

 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, но не решает проблему объекта connection.

Как мне следует утилизировать объект Connection?

Я мог бы завершить соединение с помощью попытки… Наконец, вот так:

 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.. Наконец, для объекта connection?

Ответ №1:

По какой-либо причине вы не можете использовать 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
  

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

Комментарии:

1. Нет, я хочу знать, как это сделать с TableAdapters.

Ответ №2:

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

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

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

 global::System.Data.ConnectionState previousConnectionState = this.Adapter.InsertCommand.Connection.State;
    if (((this.Adapter.InsertCommand.Connection.State amp; 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();
        }
    }
  

Поэтому нет необходимости закрывать или утилизировать объект connection.