Как мне преобразовать 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 ответа

Решение

Просто вызовите CreateDataReader для вашей таблицы данных

DataReader - это самый быстрый способ чтения хранилища данных, но только при соблюдении определенных условий:

  1. Данные должны быть прочитаны только для пересылки.
  2. Данные должны быть только для чтения.

Даже если эти условия выполняются вашим сценарием, DataReader представляет собой Connected Datastore, что означает, что вам нужно будет поддерживать ваше соединение открытым в течение всего времени, когда DataReader передается по сети, и пока вызываемый метод на другом конце не вернет некоторое своего рода ответ.

Поэтому, по моему мнению, активный DataReader никогда не должен передаваться через различные уровни и приложения. Я бы предпочел сначала извлечь данные в другое хранилище или коллекцию данных и немедленно избавиться от DataReader.

Не существует существующего класса, который сделает это за вас. Но вам не должно быть сложно написать сериализуемый класс, который реализует IDataReader и является оберткой вокруг вашей существующей DataTable.

РЕДАКТИРОВАТЬ: вам может быть проще наследовать от DbDataReader (я думаю, проверьте базовый класс SqlDataReader в проводнике объектов). Он предоставляет некоторые возможности интерфейса для вас. Но да, это все еще довольно много скучного кода.

Ты не можешь DataReader и DataTable - это две разные вещи.

Поскольку DataReader позволяет вам читать данные в виде потока, я не совсем понимаю, почему вы хотите сделать это на стороне клиента.

DataReader обычно используется для чтения данных из базы данных и добавления логики для заполнения списка объектов или DataTable. Поэтому лучше всего делать большую часть бизнес-логики, которая связана со сборкой DataTable на веб-сервисе, передавать ее клиенту как веб-сервис и работать с другими функциями ADO.Net для получения дополнительной бизнес-логики.

Может быть, вы можете быть более конкретным, почему вы действительно хотите DataReader?

Другие вопросы по тегам