Ошибка броска на SQLDataReader

Мой сайт использует библиотеку v 5.0 предприятия. Главным образом DAAB. Некоторые функции, такие как executescalar, executedataset работают как ожидалось. Проблемы появляются, когда я начинаю использовать Читателей

У меня есть эта функция в моем, включает класс:

Public Function AssignedDepartmentDetail(ByVal Did As Integer) As SqlDataReader
    Dim reader As SqlDataReader
    Dim Command As SqlCommand = db.GetSqlStringCommand("select seomthing from somewhere where something = @did")
    db.AddInParameter(Command, "@did", Data.DbType.Int32, Did)
    reader = db.ExecuteReader(Command)
    reader.Read()
    Return reader
End Function

Это называют от моего aspx.vb как так:

reader = includes.AssignedDepartmentDetail(Did)
If reader.HasRows Then
    TheModule = reader("templatefilename")
    PageID = reader("id")
Else
    TheModule = "#"
End If

Это дает следующую ошибку на дб. Строка ExecuteReader:

Не мог бросить объект типа 'Microsoft. Методы. EnterpriseLibrary. Данные. RefCountingDataReader' для ввода 'Системы. Данные. SqlClient. SqlDataReader'.

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

5
задан John Saunders 16 August 2010 в 01:42
поделиться

2 ответа

ExecuteReader в Enterprise Library оборачивает IDataReader в RefCountingDataReader, который, как и SqlDataReader, реализует интерфейс IDataReader.

RefCountingDataReader имеет свойство InnerReader, которое можно привести к SqlDataReader. Пример ниже приведен на C#, но вы можете легко преобразовать его в VB.NET.

SqlDataReader reader;
reader = ((RefCountingDataReader)db.ExecuteReader(command)).InnerReader as SqlDataReader;
if (reader != null)
    reader.Read();
return reader;

Надеюсь, это поможет

1
ответ дан 14 December 2019 в 13:28
поделиться

Я был бы осторожен с этой реализацией. На сайте Enterprise Library Codeplex есть ветка, объясняющая причину этого: http://entlib.codeplex.com/Thread/View.aspx?ThreadId=212973

Крис Таварес объясняет, что просто возвращать .InnerReader нехорошо, потому что тогда отслеживание соединения с помощью Enterprise Library отключается (его ответ от 20 мая, 17:39): «Такой подход полностью испортит ваше управление подключениями. Вся причина обертки в том, чтобы мы могли выполнить дополнительный код для очистки материала во время удаления. Захват внутреннего считывателя и выброс внешнего приведет к утечке соединений! "

Так что да, это немного неудобно, мы находимся в той же ситуации.

С уважением, Майк

3
ответ дан 14 December 2019 в 13:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: