В моем многоуровневом приложении уровень доступа к данным считывает базу данных и возвращает SqlDataReader
для коллекций объектов и SqlDataRecord
для одного объекта для бизнес-уровня. Бизнес-уровень имеет конструкторы, которые инициализируют SqlDataReader или SqlDataRecord. Это казалось естественным дизайном, но я столкнулся с множеством проблем, когда читатели выходили из сферы действия и несколько одновременных читателей. Каков лучший способ справиться с этим дизайном? Лучше ли заставить слой данных возвращать словарь полей и немедленно удалять читателей? И лучше ли использовать DataSets, где потоковая передача данных не требуется?Проблемы с многоуровневым дизайном при использовании ADO.NET
Некоторые примеры исключений, с которыми я сталкиваюсь в моем приложении:
- Invalid attempt to call MetaData when reader is closed
- There is already an open DataReader associated with this Command which must be closed first
EDIT: нашел отличную статью Contrasting the ADO.NET DataReader and DataSet. При необходимости использовать DataSets (отключенный, буферизованный подход).
так что вы в основном предлагаете то, что уже сделал Брэди, используйте DataSets вместо классов ADO.NET. Правильно? – kateroh
Да, @ Бради говорит вам то же самое, что и я. Используйте DataSets или свой собственный тип данных и строго соблюдайте SQL-запросы (объекты и классы) на уровне базы данных. Обратите внимание, что DataSet не является частью ADO.NET. –
Другой ответ от @RichardOD также предлагает то же самое и многое другое. –