从SqlDataAdapter填充DataGridView的背景

时间:2008-11-10 22:08:37

标签: sql-server datagridview background backgroundworker

我有一个大型数据集(超过100,000条记录),我希望将其加载到DataGridView中。执行此操作的存储过程可能需要10秒或更长时间才能完成。

到目前为止,我有一个BackgroundWorker阻止UI锁定,并实现了一个基本的“请等待”对话框。

我想做的是以某种方式在DataGridView中填充结果,因为它们以某种方式从数据库返回。描述它的最佳方式是SQL Server Management Studio如何执行它 - 当查询运行时,即使查询仍在执行,行也会立即返回。还有一个按钮可以停止查询并保留已返回的行。

我如何在自己的代码中执行此操作?

DataGridView仅用于显示数据行,然后用户单击其中一行以执行其他操作。什么都没有写回数据库。

5 个答案:

答案 0 :(得分:4)

似乎最好的选择是使用某种分页机制,因此您一次只向用户显示一定数量的数据。这将加快拉动数据和加载页面。您可以使用GridView的内置分页(我建议使用这种方法使用.NET缓存,因为它每次都会提取整个数据集,即使它只显示一页记录)。您还可以使用LINQ to SQL实现分页,其中您一次只能抓取一个页面。下面是我最近发现的一篇好文章的链接,该文章解释了如何做到这一点。

http://www.dbtutorials.com/display/linq-to-sql-paging-cs.aspx

答案 1 :(得分:4)

数据网格视图中有100,000行?只是说“不”!

  1. 用户一次看不到100,000行
  2. 传输100,000行的网络流量并非无关紧要
  3. 100,000个datagridview行的内存开销并非无关紧要
  4. 用户只需选择一行并继续
  5. 如果此应用曾被多个用户同时使用,则DBA会将您追捕
  6. 遵循奥斯汀的建议,一次只显示一页

答案 2 :(得分:2)

正如其他人所建议的那样,在网格中显示100K记录听起来不错,但如果你真的需要...

您的背景工作线程正确,但您必须使用数据读取器并在返回时按顺序读取行。然后,您的后台工作线程需要为从数据读取器读取的每一行的UI线程编组网格行添加。

请注意,使用单独的线程来保持UI响应的任何好处都将被否定,因为无论如何它将忙于不断添加行。我建议你实现某种批处理方法,并让UI每隔一秒左右添加一行新行。你在这里要非常小心,并考虑到可能的竞争条件。您的后台工作人员正在将datareader中的行添加到某种集合中,并且您的UI可能希望同时读取该集合 - 这几乎肯定会导致问题。

答案 3 :(得分:0)

我怀疑你可以像在Data Studio中那样在DataGridView中做到这一点。我会说,当存储过程调用完成时,您会立即获得应用程序中的所有行。

答案 4 :(得分:0)

您也可以查看一些后端调整。在这种情况下添加索引已经多次帮助了我们。尝试在启用“执行计划”选项的情况下从SQL Server Management Studio运行存储过程。寻找存储过程可能陷入困境的地方(即高执行百分比)。将鼠标悬停在项目上时,您将看到执行详细信息列表。在列表的底部,查看是否正在比较任何字段。这些都是索引候选人的死亡赠品。