Как мне преобразовать DataTable в IDatareader?
Все мы знаем, что DataReader быстрее, чем DataTables, поскольку DataReader используется при создании DataTable.
Поэтому, учитывая, что у меня уже есть DataTable.... Зачем мне преобразовывать его в DataReader?
Ну, я создаю внутренний интерфейс под названием IDataProvider. Этот интерфейс предназначен для реализации как локально, так и в виде веб-сервиса. Интерфейс будет иметь метод "Getdata", который принимает некоторую информацию о критериях и возвращает некоторые данные.
Поскольку DataReader является самым быстрым механизмом извлечения данных, я хочу использовать его как тип результата метода "GetData". Однако мы также знаем, что DataReader не сериализуем и поэтому не может передаваться через Интернет через веб-сервис...
В случае с Интернетом я бы попросил локальный прокси-класс запросить данные в виде DataTable, а затем преобразовать их локально в DataReader.
Таким образом, Локальное приложение не должно знать (или заботиться) об этом, если оно обращается к данным локально или удаленно.
Однако, чтобы сделать это, мне нужно знать... Как мне обернуть DataReader вокруг существующей DataTable?
Обновление: моя бизнес-логика не будет храниться в веб-сервисе, так как DataProvider, который использует веб-сервис, переключается на тот, который этого не делает. Поэтому businessLogic будет храниться в клиентском приложении.
FWIW Я использую.Net 3.5 SP1
4 ответа
DataReader - это самый быстрый способ чтения хранилища данных, но только при соблюдении определенных условий:
- Данные должны быть прочитаны только для пересылки.
- Данные должны быть только для чтения.
Даже если эти условия выполняются вашим сценарием, DataReader представляет собой Connected Datastore, что означает, что вам нужно будет поддерживать ваше соединение открытым в течение всего времени, когда DataReader передается по сети, и пока вызываемый метод на другом конце не вернет некоторое своего рода ответ.
Поэтому, по моему мнению, активный DataReader никогда не должен передаваться через различные уровни и приложения. Я бы предпочел сначала извлечь данные в другое хранилище или коллекцию данных и немедленно избавиться от DataReader.
Не существует существующего класса, который сделает это за вас. Но вам не должно быть сложно написать сериализуемый класс, который реализует IDataReader и является оберткой вокруг вашей существующей DataTable.
РЕДАКТИРОВАТЬ: вам может быть проще наследовать от DbDataReader (я думаю, проверьте базовый класс SqlDataReader в проводнике объектов). Он предоставляет некоторые возможности интерфейса для вас. Но да, это все еще довольно много скучного кода.
Ты не можешь DataReader и DataTable - это две разные вещи.
Поскольку DataReader позволяет вам читать данные в виде потока, я не совсем понимаю, почему вы хотите сделать это на стороне клиента.
DataReader обычно используется для чтения данных из базы данных и добавления логики для заполнения списка объектов или DataTable. Поэтому лучше всего делать большую часть бизнес-логики, которая связана со сборкой DataTable на веб-сервисе, передавать ее клиенту как веб-сервис и работать с другими функциями ADO.Net для получения дополнительной бизнес-логики.
Может быть, вы можете быть более конкретным, почему вы действительно хотите DataReader?