【问题标题】:How do I convert a DataTable to an IDatareader?如何将 DataTable 转换为 IDatareader?
【发布时间】:2009-01-26 11:51:57
【问题描述】:

我们都知道 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

【问题讨论】:

  • 2 否决票有人愿意评论为什么吗?
  • 可能是因为您只声明要使用 DataReader,因为您认为它会帮助您提高性能。有关应用程序设置、为什么要使用 DataReader 而不是 DataTable 以及业务逻辑所在位置的更多信息可能会有所帮助。
  • 业务逻辑驻留在客户端应用程序中。
  • 不确定要告诉您关于 Datareader 的原因...我的选择是 1.> 数据表/数据集 2.> 自定义结构。 3.> 数据阅读器。由于 1 和 2 在所有情况下都需要使用 3,因此 1 和 2 必须更慢。因此我选择了 3 作为事实上的传输机制。这是错的吗?
  • 如果您真的担心,请将实现细节隐藏在外观后面,这样您就可以优化您的代码,而无需修改您的使用者。然而,这可能有点困难。您可能想研究 linq-ifying 您的通讯:IQueryable 而不是 IDataReader。

标签: .net ado.net datatable idatareader


【解决方案1】:

只需在 DataTable 上调用 CreateDataReader

【讨论】:

  • @Rory,这些事情并不总是显而易见的。有太多人无法全部了解。这就是我们有 StackOverflow 的原因。
【解决方案2】:

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

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

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

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

【讨论】:

  • 在本地数据提供者的情况下,这些条件都将得到满足。在 WebdataProvider 的情况下,条件也都将得到满足。新的 Datareader 只会以只读方式向前使用。
  • 我希望 Datareader connect 到 DataTable 并因此感到非常高兴。
【解决方案3】:

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

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

【讨论】:

  • 非常感谢,这正是我所追求的。
  • 该死的,这是一个涉及的界面。
【解决方案4】:

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

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

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

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

【讨论】:

  • 我选择了DataReader,因为它是最快的机制。 Web 服务不会包含任何 BusinessLogic(可能自定义安全层除外)
猜你喜欢
  • 1970-01-01
  • 2020-09-04
  • 2014-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-06
  • 2011-12-21
相关资源
最近更新 更多