#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.