13

我们都知道 DataReader 比 DataTables 更快,因为 DataReader 用于构建 DataTable。

因此,鉴于我已经有一个 DataTable....为什么要将其转换为 DataReader?

好吧,我正在创建一个名为 IDataProvider 的内部接口。此接口旨在在本地和作为 WebService 实现。该接口将有一个方法“Getdata”,它接受一些标准信息并返回一些数据。

由于 DataReader 是最快的数据检索机制,因此我希望将其用作“GetData”方法的结果类型。但是,我们也知道 DataReader 不可序列化,因此无法通过 Web 服务在 Web 上传输...

在网络的情况下,我会让本地代理类将数据请求为 DataTable,然后在本地将其转换为 DataReader。

通过这种方式,本地应用程序不需要知道(或关心)它是在本地还是远程访问数据。

但是,为了做到这一点,我需要知道...如何将 DataReader 包装在预先存在的 DataTable 周围?

更新:我的业务逻辑不会保留在 Web 服务中,因为使用 Web 服务的 DataProvider 可以切换为不使用的。因此,businessLogic 将保存在客户端应用程序中。

FWIW我正在使用.Net 3.5 SP1

4

4 回答 4

33

只需在 DataTable 上调用 CreateDataReader

于 2009-01-27T16:23:36.873 回答
1

DataReader 是读取数据存储的最快方法,但前提是满足某些条件:

  1. 数据将以只进方式读取。
  2. 数据是只读的。

即使您的方案满足这些条件,DataReader 也代表一个 Connected Datastore,这意味着您需要在 DataReader 通过网络传递的整个过程中保持连接打开,直到另一端调用的方法返回一些种回应。

因此,我认为永远不应该通过各种层和应用程序传递活动的 DataReader。我宁愿先将数据提取到另一个数据存储或集合中,然后立即处理 DataReader。

于 2009-01-26T12:40:10.617 回答
0

没有现有的课程可以为您执行此操作。但是编写一个实现 IDataReader 并且是现有 DataTable 的包装器的可序列化类对您来说应该不难。

编辑:您可能会发现从 DbDataReader 继承更容易(我认为,请在对象资源管理器中检查 SqlDataReader 的基类)。它为您提供了一些界面实现。但是,是的,它仍然是很多枯燥的代码。

于 2009-01-26T12:35:06.633 回答
-2

你不能。DataReader 和 DataTable 是两个不同的东西。

由于 DataReader 使您能够以流的形式读取数据,因此我真的不明白您为什么要在客户端执行此操作。

DataReader 通常用于从数据库中读取数据并添加逻辑以填充对象列表或 DataTable。因此,最好执行与在 Web 服务上构建 DataTable 有关的大多数业务逻辑,将其作为 Web 服务传递给客户端,并与那里的其他 ADO.Net 功能一起使用以获得更多业务逻辑。

也许您可以更具体地说明您真正想要 DataReader 的原因?

于 2009-01-26T11:59:36.330 回答