主題:
[其他]
[求助]請教 VB.NET 2005 DataGridView 的效率
[打印本頁]
發表人:
htkstw
時間:
2007-2-16 06:53 PM
主題:
[求助]請教 VB.NET 2005 DataGridView 的效率
剛想從 VB6 想跳至 VB.NET 2005 就遇到這個棘手的問題...
我用DataGridView顯示一個陣列清單的資料, 資料筆數是10000筆, 結果要等上7~10秒鐘才會顯示出來, 經過我找尋解決的方法後, 只要 VirtualMode 設成 True, AutoSizeColumnsMode 設成 None, 效率則可以大大的提升到瞬間即顯示出來.
現在我再用DataGridView直接連結oledb資料庫來顯示資料, 資料筆數是16000筆, 結果要等上10~15秒鐘才會顯示出來, 即使以上述方法也沒辦法有效率的立即顯示出來.
我在網路上找了好久, 一直沒找到關於這方面的資訊. 大陸那邊有人說過連結資料庫要顯示大量資料時, DataGridView 的效率是很差的, 這是真的嗎? 請問有沒有辦法解決?
謝謝.
發表人:
steven211
時間:
2007-2-19 10:26 PM
這個問題跟我上次遇到的有點類似,
http://twed2k.org/viewthread.php?tid=131037&extra=page%3D1
我想主要的速度瓶頸是出在broser吧!
當broser接收網頁的Tag然後轉成我們可視的網頁時也是需要CPU下去處理的,
當你遇到資料一多時就是會發生這種問題,
你可以先打開工作管理員並在Load網頁的時候觀查看看CPU是否滿載,
你是做統計分析類的報表嗎?
不然可以嘗試用使用分頁顯示。
發表人:
htkstw
時間:
2007-2-20 10:35 AM
糟了!也許是發在這一區, 讓你誤認為是網頁相關的程式問題, 其實不是, 純粹是windows應用程式的問題.
搞了這許多天來, DataGridView這個問題始終還是沒解. 真是讓我很奇怪, 怎麼大家都沒遇到這種狀況嗎? 如果真是這樣, 那應該是我個人寫程式的關係了, 只是一直找不到答案, 所以也一直卡在這裡.
我前天做了一個小實驗, 以3600筆6個欄位的資料來做, 一樣DataGridView繫結資料庫直接顯示出來要5~6秒(這也太離譜了!). 但是如果只用變數取出來, 不在DataGridView顯示, 則是立即就完成了, 這中間還需要先經過判斷是否為NULL值呢! 由此我判斷, 問題應該不在於資料庫物件, 而在於DataGridView物件本身了.
如果再參考到我上面說的第一例, 我想, 應該在DataGridView物件在取出資料並顯示的這一段過程的問題, 只是如何解決我一直找不到, 啊~~~~~太悲慘了!
發表人:
ithinkurdumb
時間:
2007-3-3 04:24 PM
第一個問題是因為ADO.NET是針對SqlClient來開發的,
所以碰到OleDbClient的時候一定有performance penalty,
要是資料量狠大,
penalty會相當嚴重.
這也是為什麼Microsoft這兩年來一直在鼓勵developers把Windows Application的資料庫從Access改成SQL Express或是SQL Mobile.
其次是DataGridView本身的設計所造成的.
DataGridView是一個非常有彈性的架構,
不過預設並沒有對大量的資料做最佳化.
關於如何將DataGridView針對大量的資料做最佳化,
可以參考這篇MSDN:
http://msdn2.microsoft.com/en-us/library/ha5xt0d9.aspx
其他的資料可以參考:
http://msdn2.microsoft.com/en-us/library/ms171621.aspx
最後還有一點在某些情況也能夠大幅提高效能,
就是在能用DataReader的時候盡量用.
如果只是要從database把資料拉出來,
而且不需要排序 (或是能用sql query / stored procedure等等來排序),
就使用DataReader.
DataReader的效率是所有data access method中最好的 (而且超出其他狠多).
希望有幫助囉 ;)
發表人:
dayi
時間:
2007-3-3 06:25 PM
先說明,我沒實做過.net的DataGridView
我是用java做過datagrid
在遇到大量資料時會"爆慢",十萬筆要等上一分多鐘
後來找出原因
是在於datagrid要滿足一個條件
"資料全部fetch到本端"
這時才會顯示
後來我就在datagrid上動手腳,給一個fetch row的變數 N
datagrid只要抓到N rows之後就當做完成,便把資料顯示出來
再利用元件本身是動態資料來源的特性,在後端繼續把資料丟到grid裡
這樣就可以達到效率和資料完整性的平衡
給您參考一下
發表人:
ma1111
時間:
2008-3-29 07:41 PM
天下沒有白吃的午餐,
這種RAD導向的控制項效率一向如此,
重點在fetch cache的時間點及地方,
樓上有些建議是可行的
發表人:
psycho
時間:
2008-4-4 11:48 AM
JAVA 可以用ajax和comet
來傳資料
發表人:
soupjvc999
時間:
2008-4-18 02:25 PM
ithinkurdumb 與 dayi的方法不錯喔!!
受教了!!
歡迎光臨 TWed2k (http://twed2k.org/)
Powered by Discuz! 4.1.0