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