【问题标题】:How to best show progress info when using ADO.NET?使用 ADO.NET 时如何最好地显示进度信息?
【发布时间】:2010-04-10 16:12:25
【问题描述】:

我想在执行可能冗长的数据库操作时向用户显示详细的进度信息。具体来说,在插入/更新可能为数百 KB 或 MB 的数据时。

目前,我正在使用内存中的 DataTables 和 DataRows,然后通过 TableAdapter.Update 调用与数据库同步。这工作得很好而且很花哨,但是单个调用几乎没有机会收集任何类型的进度信息以显示给用户。我不知道有多少数据通过网络传递到远程数据库或其进度。基本上,我只知道 Update 何时返回并假定它已完成(除非有任何错误或异常)。但这意味着我只能显示 0%,然后是暂停,然后是 100%。

我可以计算行数,甚至可以计算出实际修改或添加的行数,我什至可以根据每列的数据类型计算每个 DataRow 的估计大小,使用 sizeof 作为值类型,例如int 并检查字符串或字节数组之类的长度。有了这个,我可能会在更新之前确定估计的总传输大小,但是一旦在 TableAdapter 上调用 Update,我仍然没有任何进度信息。

我只是在使用不确定的进度条或鼠标等待光标时卡住了吗?我是否需要从根本上改变我们的数据访问层才能连接到这种信息?即使我无法将其精确到传输的 KB(如网络浏览器文件下载进度条),我是否至少可以知道每个 DataRow/DataTable 何时完成?

您如何最好地使用 ADO.NET 显示这种进度信息?

【问题讨论】:

    标签: .net ado.net progress-bar


    【解决方案1】:

    SELECT 部分有一个半解决方案,即首先发出COUNT 查询以获取您希望接收的行数。这仅在COUNT 查询可以非常快地返回结果(即在几分之一秒内)时才实用 - 另一方面,如果运行需要几秒钟,则查询执行本身(与结果枚举相反) ) 可能需要比数据传输更长的时间,在这种情况下,根本不值得尝试显示离散的进度条。

    至于UPDATEINSERT - 不,没有任何简单的解决方案,尤其是使用TableAdapters。如果您有大量数据要发送,您可能需要考虑使用SqlBulkCopy 类上传到临时表,然后在服务器上执行实际更新。该类提供NotifyAfter 属性和SqlRowsCopied 事件,可以为您提供当前进度的合理近似值(在这种情况下,您已经知道总行数,因为它们在内存中)。

    这当然需要对您当前的 TableAdapter 实现进行重大更改,但 .NET 中的类型化数据集系统实际上并不能通过 LAN 连接以外的任何方式处理这种大小的记录集。

    我认为大多数人会简单地选择使用字幕进度条。如今,用户期望这一点;即使您可以准确地预测行数和数据传输率,您仍然不知道查询实际执行需要多长时间,尤其是在服务器负载过重的情况下,而且提供 @ 可能会更糟987654324@比没有估计。

    如果查询(或更新)本身有可能需要很长时间才能在服务器本身上运行,不计算上传/下载记录的任何时间,那么我肯定会改用选取框进度条。否则……祝你好运。

    【讨论】:

    • SqlBulkCopy 是否尝试将所有行作为新行插入?我的意思是,如果在调用 WriteToServer 时传递给它的 DataTable 有一些行是RowState == Modified,那么它是更新这些行还是使用新的 PK 插入副本?如果启用 KeepIdentity 会怎样?如果它尝试插入并且 PK 相同,那么我想它会抛出一个 SqlException。也许这值得一个单独的问题。 MSDN 文档并不具体...
    • 没关系。当 MSDN 文档失败时,MSDN 博客来救援。 blogs.msdn.com/irenak/archive/2006/02/10/529553.aspx
    • @Yadyn: SqlBulkCopy 包装了一个不会更新的批量插入操作,这就是您需要使用临时表的原因。一般来说,让DataSet 和相关类与框架中的任何其他数据类一起工作你不会有太多运气——你可能不得不开始远离那些,因为它们是基于将整个记录集加载到内存而不是从 TDS 流式传输的概念。
    【解决方案2】:

    正如 Aaronaught 所说 - 带有 NotifyAfter 的 SqlBulkCopy 应该可以工作(不过它对我有用)。

    我认为这不会对您当前的 DAL 实施造成“重大变化”...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多