Удаление пользовательских ссылок уровня доступа к данным
Наше приложение почти исключительно использует пользовательский класс 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-переменную и вызываем нужный метод. После использования 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 ответ
Если DAL содержит хотя бы одну переменную-член Disposable (реализует IDisposable), то он также должен реализовывать IDisposable. Затем это будет указывать клиенту DAL, что Dispose () должен быть вызван. Затем метод DAL Dispose () будет вызывать переменную-член (ы) Dispose ().
Это общее руководство по реализации IDisposable.
Кстати - нет необходимости dbreader = nothing
- ничего не добивается. Посмотреть сообщение Эрика Липперта