Как мне преобразовать DataTable в IDatareader? - PullRequest
12 голосов
/ 26 января 2009

Мы все знаем, что DataReaders быстрее, чем DataTables, так как DataReader используется при построении DataTable.

Поэтому, учитывая, что у меня уже есть DataTable .... Почему я хочу преобразовать его в DataReader?

Я создаю внутренний интерфейс с именем IDataProvider. Этот интерфейс предназначен для реализации как локально, так и в виде веб-сервиса. Интерфейс будет иметь метод «Getdata», который принимает некоторую информацию о критериях и возвращает некоторые данные.

Поскольку DataReader является самым быстрым механизмом извлечения данных, я хочу использовать его как тип результата метода «GetData». Однако мы также знаем, что DataReader не сериализуем и поэтому не может передаваться через Интернет через веб-сервис ...

В случае с Интернетом я бы попросил локальный прокси-класс запросить данные как DataTable, а затем преобразовать их локально в DataReader.

Таким образом, Локальное приложение не должно знать (или заботиться) об этом, если оно обращается к данным локально или удаленно.

Однако для этого мне нужно знать ... Как мне обернуть DataReader вокруг существующей DataTable?

Обновление: моя бизнес-логика не будет храниться в веб-сервисе, поскольку DataProvider, который использует веб-сервис, переключается на тот, который этого не делает. Поэтому businessLogic будет храниться в клиентском приложении.

FWIW Я использую .Net 3.5 SP1

Ответы [ 4 ]

29 голосов
/ 27 января 2009

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

1 голос
/ 26 января 2009

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

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

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

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

0 голосов
/ 26 января 2009

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

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

0 голосов
/ 26 января 2009

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

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

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

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

...