none
請問c#有像vfp的table的東西嗎?或是如何減少記憶體的使用 RRS feed

  • 問題

  • 各位大大好

    我最近開發的一個專案是從要vfp版本改成c#、wpf  (為了支援UNICODE)

    最近寫到一個功能,發生了問題

    就是說有一個功能,會從資料庫取出龐大的資料後,放入表格中,讓使用者看數據,之後再匯出這些資料到EXCEL

    我現在用sqldataadpter 轉成datatable 大概會吃掉1g左右的記憶體

    但是在vfp中的程式裡,記憶體才不到100m

    我想詢問的問題是

    1..為什麼VFP的記憶體會用的那麼少

    2.有什麼方式能有效的降低DataTable在記憶體中的使用量嗎?

    或是有什麼方式能模擬問題1中,VFP的方式嗎?






    • 已編輯 momo16542 2017年12月26日 下午 03:54
    2017年12月26日 上午 09:07

解答

  • VFP 用 ADO ,屬於在線式。

    .Net (VBNET / C#) 用 ADO.NET ,屬於離線式。

    在線式使用時才撈資料,資料庫需要持續連線。

    離線式是先撈資料,資料庫讀完資料後關閉連線。

    因此,離線式資料庫要養成需要啥查詢啥,例如分頁查詢,不要和在線式相同觀念,開著隨時改指標位置。


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    • 已提議為解答 CuteFrank1314 2017年12月28日 上午 01:23
    • 已標示為解答 momo16542 2017年12月28日 上午 03:13
    2017年12月26日 下午 02:41
  • 就算是 VFP 也不可能一次把所有的資料都載到記憶體,一定都是有做一次取多少列 (只是 UI 可能設計得太好讓你沒感覺)。

    不然資料量一大穩死的,而且 VFP 發展的時候記憶體可能還是以 KB (之後才有 MB) 算的,若都這樣做早就不用玩了...

    如果只是單一個人使用,那 connection 抓著倒還好,問題是你取資料的方式,不能是一次撈一大堆,而是有需要時才撈,使用者也不可能看所有的資料 (如果有一百萬筆的話),一定都是用搜尋,所以你的程式要直接對資料庫搜尋,而不是把所有的資料都撈出來再搜尋。

    匯出 Excel 也是一樣。


    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    • 已提議為解答 CuteFrank1314 2017年12月28日 上午 01:23
    • 已標示為解答 momo16542 2017年12月28日 上午 03:13
    2017年12月27日 上午 12:06
    版主

所有回覆

  • VFP 用 ADO ,屬於在線式。

    .Net (VBNET / C#) 用 ADO.NET ,屬於離線式。

    在線式使用時才撈資料,資料庫需要持續連線。

    離線式是先撈資料,資料庫讀完資料後關閉連線。

    因此,離線式資料庫要養成需要啥查詢啥,例如分頁查詢,不要和在線式相同觀念,開著隨時改指標位置。


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    • 已提議為解答 CuteFrank1314 2017年12月28日 上午 01:23
    • 已標示為解答 momo16542 2017年12月28日 上午 03:13
    2017年12月26日 下午 02:41
  • 心冷熱情惜大大你好,感謝你的回覆


    我有上網搜尋過SQLite,想說先將遠端的SQL載到本地的SQLITE中,在讀取本地的資料

    但是看了網上的範例,要使用的時候也是要載入到記憶體中

    請問有什麼方式能降低記憶體的使用量或是透過模擬VFP的方式來降低記憶體嗎?

    2017年12月26日 下午 03:58
  • 就算是 VFP 也不可能一次把所有的資料都載到記憶體,一定都是有做一次取多少列 (只是 UI 可能設計得太好讓你沒感覺)。

    不然資料量一大穩死的,而且 VFP 發展的時候記憶體可能還是以 KB (之後才有 MB) 算的,若都這樣做早就不用玩了...

    如果只是單一個人使用,那 connection 抓著倒還好,問題是你取資料的方式,不能是一次撈一大堆,而是有需要時才撈,使用者也不可能看所有的資料 (如果有一百萬筆的話),一定都是用搜尋,所以你的程式要直接對資料庫搜尋,而不是把所有的資料都撈出來再搜尋。

    匯出 Excel 也是一樣。


    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    • 已提議為解答 CuteFrank1314 2017年12月28日 上午 01:23
    • 已標示為解答 momo16542 2017年12月28日 上午 03:13
    2017年12月27日 上午 12:06
    版主
  • 您可以改用SqlDataReader, 其效率和記憶體用量都有差別, 請參考:

    DataSet Vs DataReader Performance Test – Loading a GridView

    2017年12月27日 上午 12:37