none
請問如何快速更新DataGridView資料? RRS feed

  • 問題

  • 各位先進好

    小弟以VB2005開發

    用一個DataGridView來顯示Access之資料表1

    以objcon = New OleDbConnection(strdbcon)

    以SQL語法:"UPDATE 資料表 SET column1=value1,column2=value2,... WHERE 索引=x"

    並以objdataadapter = New OleDbDataAdapter(strSQL, objcon)執行

    以for迴圈更新總共約25筆資料每筆資料有3個欄位也就是25*3個資料更新

    完成更新後再以objdataadapter.Fill(DataSet1, "資料")填入dataset

    更新週期為1秒也就是每秒更新25*3個資料

    不會做資料列的新增永遠都是25列中的資料內容再做更新

    目前DataGridView會更新也會顯示

    但是現在的問題是執行起來很慢

    會發現畫面遲滯的蠻嚴重的

    請問個位先進

    如何能快速更新DataGridView中的值並且兼顧程式效率

    小弟並不一定需要每筆資料在做更新時都與資料庫同步更新

    可以緩衝到buffer後再更新資料庫內容

    但是問題是我的DataGridView必須是每秒同步顯示最新的數據

    請問有什麼好方法嗎?

    謝謝!!

    2011年11月7日 上午 08:48

解答

  • DataGridView不一定要繫結到資料庫啊

    用個Array,List或是其他的資料結構 存資料
    顯示資料時讀取內部資料結構的資料就好
    更新資料庫的資料也是讀取內部資料結構的資料

     

    Public Class Form1
        Dim Data(25, 3) As Integer
        Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            InitializeData()
        End Sub
    
        Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
            UpdateDataGridView()
        End Sub
    
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            UpdateData()
        End Sub
    
        Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
            UpdateDataBase()
        End Sub
    
        Private Sub InitializeData()
            Dim r As New Random()
            For i = 0 To 24
                Data(i, 0) = r.Next(100)
                Data(i, 1) = r.Next(100)
                Data(i, 2) = r.Next(100)
                DataGridView1.Rows.Add(Data(i, 0), Data(i, 1), Data(i, 2))
            Next
        End Sub
    
        Private Sub UpdateData()
            Dim r As New Random()
            Dim row As Integer = r.Next(25)
            Dim column As Integer = r.Next(3)
            Dim value As Integer = r.Next(100)
            Data(row, column) = value
        End Sub
    
        Private Sub UpdateDataBase()
            Throw New NotImplementedException
        End Sub
    
        Private Sub UpdateDataGridView()
            DataGridView1.Rows.Clear()
            For i = 0 To 24
                DataGridView1.Rows.Add(Data(i, 0), Data(i, 1), Data(i, 2))
            Next
        End Sub
    
    End Class
    

     


    以下為簽名檔,如果你愛拉椅子坐那就是你的問題。
    先查MSDN文件庫
    再用GOOGLE搜尋
    才到論壇來發問

     

    這是論壇不是技術支援中心
    沒有人得無償解答你的問題

     

    在標題或文章註明很急
    不會增加網友回覆速度

    • 已編輯 Alex_Lee 2011年11月10日 下午 01:18
    • 已標示為解答 jerrelkai 2011年11月15日 上午 03:17
    2011年11月10日 下午 12:53

所有回覆

  • 你更新DataGridView 的Code ?

     


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2011年11月7日 下午 12:10
    版主
  • 不是的Bill大

    我只是使用OleDbDataAdapter做UPDATE

    以及Fill to DataSet

    將結果秀在DataGridView並沒有更改code

    只是會有嚴重的延遲,整頁更新大約會有0.5秒視窗是沒有辦法做別的事情

    而且我每秒都要跟新一次,所以大部分資源都在處理這部分

    我有點困擾,是否有更好的方式讓UPDATE資料庫這部分

    緩點作沒關係只是DataGridView的顯示則必須立即每秒同步

    或許UPDATE資料庫交給執行緒處理都沒關係,小弟對執行緒還

    不是很了解,有誤之處請包涵。懇請賜教謝謝Bill大!

     

    2011年11月7日 下午 04:02
  • 感覺上更新頻率有點快, 也就是1秒鐘要更新25筆記錄, 並將新記錄從資料庫讀出到DataGridView中, 建議降低更新頻率, 再利用執行緒執行更新資料庫記錄的動作
    2011年11月8日 上午 01:30
  • 謝謝tihs大

    正在努力中...

    但是1秒的更新頻率沒有辦法降低

    2011年11月9日 上午 07:29
  • 我有個疑問

    資料庫的資料可以不用 即時更新

    也就代表datagridview顯示的資料 並不是即時的

    這樣 datagridview 每秒更新 的意義是甚麼?

     

     


    以下為簽名檔,如果你愛拉椅子坐那就是你的問題。
    先查MSDN文件庫
    再用GOOGLE搜尋
    才到論壇來發問

    這是論壇不是技術支援中心
    沒有人得無償解答你的問題

    在標題或文章註明很急
    不會增加網友回覆速度
    2011年11月9日 上午 07:38
  • Alex大

    因為DataGridView我目前只試過利用objdataadapter來做更新

    然後再重新Fill到DataSet再將DataGridView.Source指向到

    此DataSet,所以datagridview會跟資料庫做同步更新

    而資料庫存取會吃很多資源所以應用程式會變慢

    不知道有沒有什麼建議呢?

    謝謝

    2011年11月10日 上午 05:33
  • DataGridView不一定要繫結到資料庫啊

    用個Array,List或是其他的資料結構 存資料
    顯示資料時讀取內部資料結構的資料就好
    更新資料庫的資料也是讀取內部資料結構的資料

     

    Public Class Form1
        Dim Data(25, 3) As Integer
        Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            InitializeData()
        End Sub
    
        Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
            UpdateDataGridView()
        End Sub
    
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            UpdateData()
        End Sub
    
        Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
            UpdateDataBase()
        End Sub
    
        Private Sub InitializeData()
            Dim r As New Random()
            For i = 0 To 24
                Data(i, 0) = r.Next(100)
                Data(i, 1) = r.Next(100)
                Data(i, 2) = r.Next(100)
                DataGridView1.Rows.Add(Data(i, 0), Data(i, 1), Data(i, 2))
            Next
        End Sub
    
        Private Sub UpdateData()
            Dim r As New Random()
            Dim row As Integer = r.Next(25)
            Dim column As Integer = r.Next(3)
            Dim value As Integer = r.Next(100)
            Data(row, column) = value
        End Sub
    
        Private Sub UpdateDataBase()
            Throw New NotImplementedException
        End Sub
    
        Private Sub UpdateDataGridView()
            DataGridView1.Rows.Clear()
            For i = 0 To 24
                DataGridView1.Rows.Add(Data(i, 0), Data(i, 1), Data(i, 2))
            Next
        End Sub
    
    End Class
    

     


    以下為簽名檔,如果你愛拉椅子坐那就是你的問題。
    先查MSDN文件庫
    再用GOOGLE搜尋
    才到論壇來發問

     

    這是論壇不是技術支援中心
    沒有人得無償解答你的問題

     

    在標題或文章註明很急
    不會增加網友回覆速度

    • 已編輯 Alex_Lee 2011年11月10日 下午 01:18
    • 已標示為解答 jerrelkai 2011年11月15日 上午 03:17
    2011年11月10日 下午 12:53
  • Alex大

    因為DataGridView我目前只試過利用objdataadapter來做更新

    然後再重新Fill到DataSet再將DataGridView.Source指向到

    此DataSet,所以datagridview會跟資料庫做同步更新

    而資料庫存取會吃很多資源所以應用程式會變慢

    不知道有沒有什麼建議呢?

    謝謝


    dataset 本來就是大食怪, 把整個 db load 入 ram 中, 不慢才怪。我寧願用 dataReader 逐條 load 入去 datagrid 好過, 而且要作即時資訊 (如報價), 總是從 db 直讀入 datagrid 最可靠, datatable 始逐 cache 了, 不是最新
    2011年11月11日 下午 04:34
  • 我覺得這個問題的 scenario 有點奇怪。依我個人的猜測,假設 DataGridView 顯示的是像股票行情之類的資訊,每秒異動一次是合理的。但是異動的數字是以「更新」的方法寫回資料庫而不是「新增」,那麼是不是可以考慮把寫入資料庫再讀出來這一段整個省下來?收盤時寫入一次就行了。

    如果我所描述的情況是可以接受的,那麼整個過程都可以無需讀寫資料庫;DataGridView 的資料繫結來源可以改用存放在記憶體中的 DataTable 或是 List。才 25 * 3 個欄位,應該不會有任何遲滯的感覺。

     


    ASP.NET 2Share - http://www.dotblogs.com.tw/johnny
    2011年11月11日 下午 05:57
  • 我用的 "報價" 比喻其實未必是股票報價的, 有可能樓主是作物流上的即時 "實況" 操作, 即從工序與工序間, 在不同部間都可分享即時的 "狀況"。例如 Point of Sale 售了一件貨品, 那麼 Goods Item 00550 的 Qty 可能到了要 re-order 的門檻, Purchasing 部門就會收到 signal 要訂貨了。會計部如果要知道現金流, 就可從 db 看到有幾多現金。這些都不能寄存在 datatable 內, 否則有什麼故障, 所有資料都失掉了。
    2011年11月13日 下午 04:36
  • 謝謝Alex大的程式碼

    抱歉這麼晚回

    這部份可能如同大大所建議的

    一行一行的直接寫入datagridview

    我也發現adapter在執行Fill時特別耗時

    這可能最花時間的地方

    先將datagridview更新完後再

    單純使用SQL之UPDATE指令對資料庫做

    每秒更新25筆記錄,只是不知道是否也會很花時間

    這部份待好了時候再跟大家分享了

    謝謝!

    2011年11月15日 上午 03:17
  • 抱歉

    沒有說的很詳細

    datagridview的部份是25*3的值更新

    但是資料庫的部份會有上百筆的紀錄

    在做更新,每次更新也是這25*3個cell做更新

    當然資料庫的存放方式跟grid不太一樣

    由於篇幅的關係grid的瀏覽格式有調整

    而資料庫是以每row存放25*3欄

    也就是每列75個欄位更新

    以上

    謝謝!

     

    2011年11月15日 上午 03:32
  • asphk大大

    差不多的應用概念

    為要要掌握住每秒的的資料

    能儘量的同步於db中

    以上

    謝謝分享!

    2011年11月15日 上午 03:35