Как преобразовать DataTable в IDatareader?

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

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

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

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

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

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

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

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

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

Ответ 1

Просто вызовите CreateDataReader в вашем DataTable

Ответ 2

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

  • Данные должны считываться только в прямом режиме.
  • Данные должны быть доступны только для чтения.

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

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

Ответ 3

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

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

Ответ 4

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

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

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

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