【问题标题】:SqlDataReader only evaluate a row at a timeSqlDataReader 一次只计算一行
【发布时间】:2015-12-07 00:17:49
【问题描述】:

看起来 SqlDataReader 实际上会一次抓取多行

我有一种情况,我需要一次抓取一行。 在 SqlDataReader 循环中,我可以使用单独的 SQL 命令更改、插入或删除行。 我遇到的问题是,可能是 SqlDataReader 预取的数据发生了变化,所以我得到了陈旧的数据。 我真的不需要查看循环中执行的插入,但如果我阅读它们,它不会破坏任何东西。

如何让 SqlDataReader.Read() 从数据库中一次实际读取一行?

【问题讨论】:

  • DataReader 的设计初衷不是为了完成您正在做的事情。它旨在避免一次将所有数据通过管道传输,从而提高效率。您将不得不重新考虑您的设计。
  • 您看到的是事务如何工作的效果。数据的检索是在事务范围内完成的,这意味着您可以在事务期间看到一致的数据视图。想象一下,在银行场景中,您将资金从一个账户转移到另一个账户。如果您在借记后阅读第一个帐户,而在贷记之前阅读第二个帐户,则看起来您没有钱。你可能不会很喜欢那样。您也许可以调整隔离级别,以便允许脏/幻读。
  • @BLam 错了,这完全是交易的事情。也许一些基础教育是必要的 - 阅读 ACID 并阅读 cobbs 的关系定理。您违反了 A 和 I - SQL 事务支柱中的两个。
  • @Blam 绝对存在 ACID ciolation,除非您在一个连接上使用 MARS 或人为地将多个连接合并到一个事务 - 否则 I 部分会出现,并且设计真的很奇怪。
  • 正如 TomTom 所说,您是不正确的。数据库中的每个操作都是在事务的上下文中执行的,无论是显式的还是隐式的。事务不一定会阻塞其他操作,它只是确保您的数据库视图在操作期间保持一致。

标签: .net sqldatareader


【解决方案1】:

SQL Server 将尽可能多的结果集行放入网络数据包中,并尽可能快地将它们发送到客户端。然后将包含结果集行的数据包缓存在客户端的网络缓冲区中,并由访问驱动程序读取。
一个一个读出来发给客户端会很慢。

【讨论】:

  • 所以我会放慢当前数据的速度。在 oracle 中,您可以配置 fetchsize。我还没有放弃 SQLdataReader。
  • 好吧,在 SQL Server 中你不能——所以放弃吧。关键是,除非你拉出一些非常有趣的东西,否则无论如何你都不走运,因为你的方法违背了 SQL 所代表的任何东西——你违反了 ACID 条件,主要是 A 和 I(原子和隔离)。你也认为这是关于阅读 - 它不是。 SQL Srver 将尽可能快地处理。
  • @Blam 如果您可以将您正在做的任何事情移动到存储过程中并使用游标执行您的查询,我认为您正在尝试做的事情是可能的。
  • 我也许可以用顺序访问来愚弄它,但不会冒险。由于数据有 PK 我的想法只是验证每次读取。如果该行已消失或该行已更改,那么对于我正在做的事情,我知道我可以跳过该行。我可能会接受你的回答,但让我玩一会儿。
  • @Blam 可能,但我对此表示怀疑。我认为缓冲区将充满尽可能多的数据。只有指定的 sequential access 小于完整的行才能被缓冲并可供读取器使用,因为它旨在用于将 blob 作为流读取。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-09
  • 2015-04-08
  • 2019-11-18
  • 1970-01-01
  • 1970-01-01
  • 2021-11-07
  • 1970-01-01
相关资源
最近更新 更多