Удаление пользовательских ссылок уровня доступа к данным - PullRequest
0 голосов
/ 01 октября 2010

Наше приложение почти исключительно использует пользовательский класс DataAccessLayer, и в рамках этого мы используем блок доступа к данным (в настоящее время версия 2).Мы периодически получаем печально известную ошибку «GetOrdinal».Мы не используем соединения вне метода.Мы используем версию DAAB 2. Ниже приведен типичный пример наших методов DAL:

Public Function MyDALMethod(ByVal Param1 As Integer, ByVal Param2 As Integer) As System.Data.IDataReader

        Dim db As Database = DatabaseFactory.CreateDatabase()
        Dim sqlCommand As String = "usp_MyProcedure"
        Dim dbCommand As DbCommand = db.GetStoredProcCommand(sqlCommand)
        db.AddInParameter(dbCommand, "Param1", DbType.Int32, MyParam1)
        db.AddInParameter(dbCommand, "Param2", DbType.Int32, MyParam2)

        Return db.ExecuteReader(dbCommand)

End Function

В нашем коде мы просто создаем экземпляр DAL var и вызываем нужный метод.После использования DataReader ссылочный код закроется, удалится и отключит считыватель.Тем не менее, ничего не сделано со ссылкой на DAL.Я задавался вопросом, является ли это частью нашей проблемы.Типичный метод будет использовать наш DAL следующим образом:

Dim DAL as New DataAccessLayer
Dim dbReader as system.data.idatareader

dbreader = DAL.MyDALMethod(parm1, parm2)

While dbreader.read
    i = dbreader.items("column1")
    j = dbreader.items("column2")
End While

dbreader.close()
dbreader.dispose()
dbreader = nothing

Мой главный вопрос заключается в том, должны ли эти ссылки DAL быть как-то удалены?Это пользовательский класс, написанный на VB.NET, поэтому он не реализует IDisposable, поэтому я не уверен, что нужно что-то делать или нет, но у нас есть ошибки и проблемы (например, проблема GetOrdinal), которые кажутся загружаемымии мне интересно, если это является частью проблемы.

1 Ответ

1 голос
/ 06 октября 2010

Если DAL содержит хотя бы одну переменную-член, которая является Disposable (реализует IDisposable), то она также должна реализовывать IDisposable.Это будет означать, что клиент DAL должен вызывать Dispose ().Затем DAL Dispose () будет вызывать переменные-члены Dispose ().

Это общее руководство по реализации IDisposable.

Кстати, - нет необходимости dbreader = nothingничего не добивается.Смотрите сообщение Эрика Липперта

...