使用SqlDataAdapter填充DataGridView的背景知识

3
我有一个超过100,000个记录的大型数据集,希望将其加载到DataGridView中。执行此操作的存储过程可能需要10秒钟或更长时间才能完成。
目前我使用了BackgroundWorker来防止UI锁定,并实现了一个简单的“请稍候”对话框。
我想做的是以某种方式填充DataGridView,以便在从数据库返回结果时立即显示它们。最好的方法是如何SQL Server Management Studio所做的-当查询运行时,行会立即返回,即使查询仍在执行。还有一个按钮用于停止查询并保留已返回的行。
如何在我的代码中实现这一点?
DataGridView仅用于显示数据行,然后用户单击其中一个行以执行其他操作。没有任何数据被写回到数据库。
5个回答

4
似乎最好的选择是使用某种分页机制,这样你只需要每次显示一定数量的数据给用户。这将加快数据提取和页面加载速度。你可以使用GridView的内置分页功能(我建议使用.NET缓存来实现此方法,因为它每次都会提取整个数据集,即使只显示一页记录)。你也可以使用LINQ to SQL实现分页,每次只获取一页数据。下面是我最近发现的一个很好的文章,讲解了如何实现分页:http://www.dbtutorials.com/display/linq-to-sql-paging-cs.aspx

4

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

  1. 用户无法同时查看100,000行
  2. 传输100,000行的网络流量并不可忽略
  3. 100,000个数据网格视图行的内存开销也不可忽略
  4. 用户只需要选择一行然后继续操作
  5. 如果此应用程序将由多个用户同时使用,数据库管理员将追究你的责任

遵循奥斯汀的建议,一次只显示一页。


2

正如其他人所建议的,将100K条记录显示在网格中似乎不是一个好主意,但如果你真的必须这样做...

你用backgroundworker线程是正确的,但你需要使用数据阅读器按顺序读取返回的行。你的background worker线程需要为从数据阅读器读取的每一行调度网格行添加到UI线程。

请注意,使用单独的线程保持UI响应的任何好处都将被抵消,因为它将不断忙于添加行。我建议你实现某种分批处理方法,并且让UI每秒仅添加一次新行。你需要非常小心,并牢记可能出现的竞态条件。可能会出现这样一种情况:你的backgroundworker正在将行从数据阅读器添加到某种集合中,而你的UI可能也想同时读取该集合——这几乎肯定会导致问题。


0

我怀疑你无法像管理工具一样在DataGridView中完成它。我认为当存储过程调用完成时,你需要一次性获取应用程序中的所有行。


0

您也可以考虑进行一些后端调优。在这种情况下添加索引已经帮助我们很多次了。尝试使用启用了“执行计划”选项的SQL Server Management Studio运行存储过程。查找存储过程可能会变慢的地方(即高执行百分比)。当您将鼠标悬停在项目上时,您将看到执行详细信息列表。在列表底部,查看是否有任何字段正在进行比较。这些是索引候选项的明显迹象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接