Как я должен отслеживать открытые DataReaders? - PullRequest
0 голосов
/ 10 июня 2009

Мне было поручено создать класс, который клиенты могут использовать для получения данных из определенного источника данных. Например, основные процедуры будут

IDataReader GetDataReader(DbCommand command);
DataSet GetDataSet(DbCommand command);

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

Однако другая часть моей задачи - отслеживать открытые DataReaders. Это просто для того, чтобы убедиться, что все закрывают своих читателей должным образом. Мой план состоял в том, чтобы внутри этого нового класса была коллекция DataReaders, которая будет добавляться при каждом вызове процедуры GetDataReader. В конце выполнения приложения код будет проходить через эту коллекцию и записывать предупреждения в файл для каждого открытого считывателя.

Итак, у меня есть 2 вопроса:

  1. Что-то не так с этим дизайном?
  2. Можно ли в любом случае выполнить команду SQL из DataReader? Это значительно упростит поиск незамкнутого читателя. Или я должен сохранить пару читатель / команда, чтобы получить эту информацию?

1 Ответ

2 голосов
/ 10 июня 2009

Рассматривали ли вы сделать компонент доступа к данным немного более высоким уровнем для обеспечения соблюдения правил? Например, для реализации политики «получить-получить-получить-данные-и-выйти-и-закрыть» мы возвращаем только наборы данных и средства масштабирования из нашего компонента доступа к данным (мы также применяем другие правила, например, только использование хранимых процедур взаимодействовать с базой данных). Если вызывающим абонентам действительно нужны только данные, а не столько программа чтения данных, возможно, вы можете прочитать данные из программы чтения и затем закрыть ее, поэтому не нужно беспокоиться о отслеживании состояния программы чтения.

Если у вас есть техническая необходимость вернуть DataReader (а их будет много), возможно, вместо возврата необработанного считывателя, вы можете создать класс-обертку или подкласс считывателя и вернуть его вместо этого ... например TrackedDataReader. Затем вы можете встроить бухгалтерский учет в сам класс. Просто мысль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...