如何将DataTable转换为IDataReader?

13
我们都知道DataReader比DataTables快,因为DataReader在构建DataTable时使用。
那么,既然我已经有了一个DataTable... 为什么我要将它转换为DataReader呢? 嗯,我正在创建一个名为IDataProvider的内部接口。该接口旨在在本地和作为Web服务实现。该接口将具有一个名为"Getdata"的方法,该方法需要一些条件信息并返回一些数据。
由于DataReader是最快的数据检索机制,因此我希望将其用作"GetData"方法的结果类型。 然而,我们也知道DataReader不可序列化,因此不能通过Web服务跨网络传输...
在Web的情况下,我将使本地代理类请求数据作为DataTable,然后在本地将其转换为DataReader。
通过这种方式,本地应用程序无需知道(或关心)其是在本地访问数据还是远程访问数据。
但是,为了实现这一点,我需要知道...如何在现有的DataTable上包装一个DataReader? 更新:我的业务逻辑不会保存在WebService中,因为使用Webservice的DataProvider可以切换为不使用它的DataProvider。业务逻辑将在客户端应用程序中实现。
值得一提的是,我正在使用.Net 3.5 SP1。

有2个踩,有人可以评论一下为什么吗? - Rory Becker
可能是因为您只是声明要使用DataReader,因为您认为它会帮助您提高性能。更多关于您的应用程序设置、为什么要使用DataReader而不是DataTable以及您的业务逻辑所在位置的信息可能会有所帮助。 - Gerrie Schenck
不确定关于Datareader的原因该告诉你什么...我的选择是1.> DataTable/Dataset 2.> 自定义结构。3.> Datareader。由于在所有情况下都需要使用1和2,所以1和2必须更慢。因此,我选择3作为事实上的传输机制。这样做有错吗? - Rory Becker
如果你真的担心这个问题,那就在一个外观(facade)后隐藏实现细节,这样你就可以优化你的代码而不必修改你的消费者。但可能会比较困难。你可能需要考虑将你的通讯转换成 LINQ:使用 IQueryable 而不是 IDataReader。 - user1228
@Will - IQueryable = 很有意思 :) - Rory Becker
显示剩余3条评论
4个回答

33

只需在您的DataTable上调用CreateDataReader()


6
@Rory,这些东西并不总是显而易见的。要知道的太多了。这就是为什么我们有StackOverflow的原因。 - IAbstract

1

DataReader是读取数据存储的最快速方式,但前提是必须满足以下条件:

  1. 数据需要以只向前的方式进行读取。
  2. 数据只能进行只读操作。

即使您的情况满足这些条件,DataReader仍代表一个连接的数据存储,这意味着您需要在整个传输过程中保持连接打开状态,直到在另一端调用的方法返回某种响应为止。

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


在本地数据提供程序的情况下,所有这些条件都将得到满足。在Web数据提供程序的情况下,这些条件也都将得到满足。新的数据读取器只会以只读向前移动的方式使用。 - Rory Becker
我希望Datareader可以连接到DataTable,这样它本身就会非常高兴。 - Rory Becker

0

目前还没有现成的类可以帮你完成这个功能。但是编写一个可序列化的类,并实现 IDataReader 接口,再将它作为现有 DataTable 的包装器,应该不难。

编辑: 你可能会发现继承自 DbDataReader 更容易一些(我想是的,可以在对象浏览器中检查SqlDataReader的基类)。它会为你提供某些接口实现。但是,编写起来仍然需要相当多的枯燥代码。


非常感谢,这正是我想要的。 - Rory Becker
该界面真是太复杂了。 - Rory Becker

-2
你不能这样做。DataReader和DataTable是两个不同的东西。
因为DataReader使您能够将数据作为流读取,所以我真的不明白您为什么想在客户端这样做。
通常使用DataReader从数据库中读取数据并添加逻辑以填充对象列表或DataTable。因此,最好在webservice上执行与DataTable构建有关的大多数业务逻辑,将其作为webservice传递给客户端,并在那里使用其他ADO.Net函数进行更多的业务逻辑。
也许您可以更具体地说明为什么确实需要DataReader吗?

我选择DataReader是因为它是最快的机制。WebService 不会包含任何业务逻辑(除了也许一个自定义安全层)。 - Rory Becker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接