我想在执行可能很长的数据库操作时向用户显示详细的进度信息。具体来说,当插入/更新可能约为数百 KB 或 MB 的数据时。
目前,我使用内存中的 DataTables 和 DataRows,然后通过 TableAdapter.Update 调用与数据库同步。这工作得很好,但单个调用几乎没有机会收集任何类型的进度信息以显示给用户。我不知道有多少数据通过网络传递到远程数据库或其进度。基本上,我所知道的是更新何时返回并且假定已完成(除非有任何错误或异常)。但这意味着我只能显示 0%,然后暂停,然后是 100%。
我可以计算行数,甚至可以计算出实际修改或添加的行数,我什至可以根据每列的数据类型计算每个 DataRow 的估计大小,使用 sizeof 作为 int 等值类型并检查字符串或字节数组等内容的长度。这样,我可能可以在更新之前确定估计的总传输大小,但是一旦在 TableAdapter 上调用 Update,我仍然没有任何进度信息。
我是否只是使用不确定的进度条或鼠标等待光标而陷入困境?我是否需要从根本上改变我们的数据访问层才能连接到此类信息?即使我无法将其精确到传输的 KB(如 Web 浏览器文件下载进度条),我至少可以知道每个 DataRow/DataTable 何时完成或其他什么吗?
如何使用 ADO.NET 最好地显示此类进度信息?
有一个半解决方案SELECT
部分,即发出COUNT
首先查询以获取您期望收到的行数。这仅在以下情况下才实用COUNT
查询可以非常快地返回结果(即不到一秒) - 另一方面,如果运行需要几秒钟,则查询执行本身(与结果枚举相反)可能比数据传输花费更长的时间,在这种情况下,根本不值得尝试显示离散的进度条。
As for UPDATE
and INSERT
- 不,实际上没有任何简单的解决方案,特别是使用 TableAdapters。如果您有大量数据要发送,您可能需要考虑使用SQL批量复制 http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy_members%28v=VS.90%29.aspx类上传到临时表,然后在服务器上执行实际更新。该课程提供之后通知 http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.notifyafter%28v=VS.90%29.aspx财产连同SqlRows已复制 http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.sqlrowscopied%28v=VS.90%29.aspx事件可以为您提供当前进度的合理近似值(在这种情况下您已经知道行总数,因为它们在内存中)。
当然,这需要对当前的 TableAdapter 实现进行重大更改,但 .NET 中的类型化数据集系统实际上并不是为了通过 LAN 连接以外的任何方式处理该大小的记录集而设计的。
我认为大多数人只会选择使用字幕进度条。如今,用户期望这一点;即使您可以准确地预测行数和数据传输速率,您仍然不知道查询实际执行需要多长时间,特别是在服务器负载很重的情况下,并且可以说提供更糟糕的情况错误的估计 http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.sqlrowscopied%28v=VS.90%29.aspx比没有估计。
如果查询(或更新)本身很可能需要很长时间在服务器本身上运行,而不计算上传/下载记录的任何时间,那么我肯定会使用选取框进度条。否则……祝你好运。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)