2009-01-26 397 views
11

我们都知道DataReader比DataTables更快,因为DataReader用于构建DataTable。如何将DataTable转换为IDatareader?

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

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

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

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

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

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

更新:我的业务逻辑不会保留在webservice中,因为使用Webservice的DataProvider是可切换的,而不是。 因此,businessLogic将被保留在客户端应用程序中。

FWIW我正在使用.Net 3.5 SP1

+0

2 Downvotes任何人都在关心评论为什么? – 2009-01-26 12:11:01

+0

可能因为您只声明您要使用DataReader,因为您认为它会帮助您提高性能。有关应用程序设置的更多信息,为什么要使用DataReader而不是DataTable以及业务逻辑所在的位置可能会有所帮助。 – 2009-01-26 12:13:10

+0

业务逻辑驻留在客户端应用程序中。 – 2009-01-26 12:20:24

回答

27

只需在您的DataTable上调用CreateDataReader

-2

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

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

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

也许你可以更具体地说明为什么你真的想要一个DataReader?

0

没有现成的课程可以为你做到这一点。但是,编写一个可实现IDataReader的可序列化类并且是现有DataTable的包装并不难。

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

1

一个DataReader是读取数据存储的最快途径,但仅当满足特定条件:

  1. 的数据是只进的方式被读出。
  2. 数据是只读的。

即使这些条件是由你的情况符合,DataReader的代表已连接的数据存储,这意味着你需要保持你的连接打开整个的DataReader的是在网络上,直到被调用的方法传递时间在另一端返回某种回应。

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