如何将DataTable转换为IDatareader?

时间:2009-01-26 11:51:58

标签: .net ado.net datatable idatareader

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

因此我已经拥有了DataTable .... 为什么我要将其转换为DataReader?

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

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

对于Web,我会让本地代理类将数据作为DataTable请求,然后将其本地转换为DataReader。

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

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

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

FWIW我正在使用.Net 3.5 SP1

4 个答案:

答案 0 :(得分:29)

只需在DataTable上调用CreateDataReader

答案 1 :(得分:1)

DataReader是读取数据存储区的最快方法,但只有在满足特定条件的情况下:

  1. 以正向方式读取数据。
  2. 数据是只读的。
  3. 即使您的方案满足这些条件,DataReader也代表一个连接数据存储区,这意味着您需要在DataReader通过网络传递的整个过程中保持连接打开,直到另一个方法的被调用方法为止。结束时会返回某种反应。

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

答案 2 :(得分:0)

没有现有的课程可以帮到你。但是编写一个可序列化的类来实现IDataReader并且是现有DataTable的包装器应该不难。

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

答案 3 :(得分:-2)

你做不到。 DataReader和DataTable是两回事。

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

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

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

相关问题