Подключение ODBC в Asp.Net (Подключение и утилизация)

#asp.net #web-applications

#asp.net #веб-приложения

Вопрос:

Я открываю и закрываю подключение ODBC, пока страница запущена и запущена. Когда и где я должен установить соединение.Метод удаления? Я попробовал на Page_Disposed, но он так и не появился.

 Public Class _WepPage1
Inherits System.Web.UI.Page

Dim MyConnection As New Odbc.OdbcConnection

Private Sub Page_Disposed(sender As Object, e As System.EventArgs) Handles Me.Disposed
    MyConnection.Dispose()
End Sub

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    'String comes from Web.Config
    MyConnection.ConnectionString = ConfigurationManager.ConnectionStrings("MyConnection").ConnectionString
    If Not IsPostBack Then
        Call LoadSomeData()
    Else
        'Do some more stuff            
    End If
End Sub

Private Sub LoadSomeData()
    If MyConnection.State = ConnectionState.Closed Then MyConnection.Open()
    Dim MyCommand As New Odbc.OdbcCommand("select * from tablename", MyConnection)
    Try
        Dim dataR As Odbc.OdbcDataReader = MyCommand.ExecuteReader
        While dataR.Read
            DropDownList1.Items.Add(dataR("column1"))
        End While
    Catch ex As Exception
    End Try
    MyCommand.Dispose()
    If MyConnection.State = ConnectionState.Open Then MyConnection.Close()
End Sub
  

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

1. Вероятно, напишите это в блоке Finally в Try Catch

2. На самом деле я делаю довольно много обращений к базе данных, когда пользователь выбирает выпадающий список, поэтому я не хотел удалять соединение, пока они не закроют приложение. Или я неправильно это понимаю?

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

Ответ №1:

Я бы не стал использовать Page_Load для запуска соединения. В .NET «реальный» объект connection возвращается в пул при Dispose() , поэтому он используется для другой работы. Даже если вы открываете, закрываете и удаляете множество раз, максимум накладных расходов составляет всего несколько микросекунд, поэтому преждевременное открытие соединения и последующее сохранение его открытым в течение всей страницы на самом деле вам не поможет.

Кроме того, открытие подключения в Page_Load означает, что вы тесно связали свой доступ к данным с вашим пользовательским интерфейсом, что оставляет вам много перестройки архитектуры, а не просто перегруппировки для разделения работы на соответствующие уровни.

Это означает, что соединение должно быть создано, использовано и удалено одним методом (в вашем примере). Это означает, что оно логически разделено и легко разделяется на разные классы и / или сборки, если приложение растет, поэтому вам нужен полный DAL.

Я бы, как минимум, переместил все операции с подключением к методу LoadSomeData(). Если вы хотите более правильного разделения задач, создайте процедуру GetSomeData() и попросите процедуру LoadSomeData() вызвать процедуру GetSomeData() и сформировать данные так, чтобы их можно было легко связать, а не использовать по одной строке за раз (в вашем примере вместо привязки объекта данных квыпадающий список, вы нажимаете по одному элементу за раз).

Я надеюсь, что это поможет, и мне жаль, что многие из приведенных примеров действительно плохи в лучших практиках. И, да, это включает в себя множество примеров от людей, которые должны знать лучше. 😉