2008-11-10 46 views
3

我有一個很大的數據集(超過100,000條記錄),我希望加載到DataGridView中。執行此操作的存儲過程可能需要10秒或更長時間才能完成。從SqlDataAdapter填充DataGridView的背景

到目前爲止,我有一個BackgroundWorker阻止UI鎖定,並實現了一個基本的「請稍候」對話框。

我想要做的是以某種方式填充DataGridView的結果,因爲它們以某種方式從數據庫返回。描述它的最好方式是SQL Server Management Studio如何執行它 - 當查詢運行時,即使查詢仍在執行,行也會立即返回。還有一個按鈕可以停止查詢並保留已返回的行。

我該如何在自己的代碼中執行此操作?

DataGridView僅用於顯示數據行,然後用戶單擊一個來執行其他操作。沒有東西會寫回數據庫。

回答

4

datagridview中的100,000行?拒絕吧」!

  1. 用戶不能看到在一個時間
  2. 網絡流量傳輸100,000行100,000行可不是個小數目
  3. 100,000的DataGridView行的內存開銷不小
  4. 用戶只需要選擇一排和
  5. 去,如果這個程序被使用過由多個用戶同時,DBA將追捕你

遵循奧斯汀的建議,並在同一時間

+0

5.讓我發笑:)) – 2009-09-16 19:58:21

0

我懷疑你可以像管理工作室那樣在DataGridView中做到這一點。我會說,當存儲過程調用完成時,您可以立即獲取應用程序中的所有行。

4

看起來最好的選擇是使用某種分頁機制,因此您一次只能向用戶顯示一定數量的數據。這將加速拉取數據並加載頁面。您可以使用GridView的內置分頁(我建議使用這種方法使用.NET緩存,因爲它每次都會提取整個數據集,即使它只顯示一頁記錄)。你也可以用LINQ to SQL實現分頁,一次只抓取一個頁面。下面是我最近發現的一篇很好的文章的鏈接,它解釋瞭如何做到這一點。

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

0

您還可以看看一些後臺調整,以及。在這種情況下添加索引已經幫助我們多次。嘗試從SQL Server Management Studio運行存儲過程並啓用「執行計劃」選項。尋找存儲過程可能陷入困境的地方(即高執行百分比)。當你將鼠標懸停在項目上時,你會看到一個執行細節列表。在列表底部,查看是否有任何字段正在進行比較。那些索引候選人的東西是不值得的。

2

只顯示一個頁面正如其他人的建議,在網格中顯示100K記錄聽起來像一個壞主意,但如果你真的有......

你來在背景工作線程的正確軌道上,但是您必須使用數據讀取器並在返回時依次讀取行。然後,您的後臺工作線程將需要編組網格行添加到UI線程,以便從數據讀取器讀取每一行。

請注意,使用單獨的線程保持UI響應的任何好處都將被否定,因爲無論如何,它都會不斷增加行。我建議你實現一些批處理方法,並且UI每隔一秒只添加一行新的行。你會在這裏非常小心,並考慮到可能的競爭條件。在背景工作者將數據讀取器中的行添加到某種集合的情況下,您的用戶界面可能需要同時讀取集合 - 這幾乎肯定會導致問題。