2008-09-17 25 views
2

我是一位遺留(但面向對象)開發工具中的經驗豐富的程序員,並切換到C#/ .Net。我正在編寫一個使用SQL Server CE 3.5的小型單用戶應用程序。我已閱讀概念DataSet和相關文檔以及我的代碼作品。我應該在C#應用程序中使用多少個DataTable對象?

現在我要確保我做「正確的」,得到經驗豐富的.Net/SQL服務器程序員一些反饋,你不從閱讀文檔得到的那種。

我已經注意到,我在幾個地方像這樣的代碼:

var myTableDataTable = new MyDataSet.MyTableDataTable(); 
myTableTableAdapter.Fill(MyTableDataTable); 

... // other code 

在單用戶應用程序,你會通常只這樣做一次,當應用程序啓動時,實例爲每一個DataTable對象表,然後存儲引用它,所以你只使用已經填充數據的單個對象?這樣你永遠只會從數據庫讀取數據一次,而不是可能多次。或者是這麼小的開銷以至於無關緊要(加上可能會對大桌產生反作用)?

+0

如果你正在轉向.NET,我會建議跳過ADO並看着Linq。 – Will 2008-09-17 20:57:16

回答

3

對於CE,它可能是一個非問題。如果您將這款應用推向成千上萬的用戶,並且他們都擊中了集中式數據庫,那麼您可能需要花一些時間進行優化。在像CE這樣的單用戶背景數據庫中,除非你有數據說明你需要優化,否則我不會爲此擔心。過早的優化等

0

2兩主幾件事情 1之間決定瓦里斯的方式將是數據訪問不斷 2.如果constanty使用的數據是有大量的數據

的在表格中,然後在第一次使用時加載它們。 如果您只是偶爾使用數據,請在需要時填寫表格,然後丟棄它。

例如,如果你有10個GUI屏幕,並且只使用myTableDataTable對他們的1,僅在該屏幕上閱讀。

0

的選擇真的不依賴於C#本身。它歸結爲:

  1. 您多久使用一次代碼中的數據?
  2. 數據是否改變(如果有的話,你會關心)?
  3. 什麼是再次獲取數據的相對(時間)的成本,相比於其他一切你的代碼呢?
  4. 你付出多少價值性能,而不是開發人員的努力/時間(對於這個特定的應用程序)?

作爲一般規則:對於數據不經常更改的生產應用程序,我可能會創建一次DataTable,然後按照您提到的那樣保留參考。我也會考慮把數據放在一個類型化的集合/列表/字典中,而不是通用的DataTable類,如果沒有別的,因爲讓編譯器能夠更好地記錄我的輸入錯誤。

對於一個簡單的實用程序,你爲自己運行「開始,做它的事情並結束」,這可能是不值得的努力。

你問有關Windows CE。在這個特別的照顧下,我很可能只會查詢一次並堅持結果。移動操作系統對桌面軟件沒有的電池和空間有額外的限制。基本上,移動操作系統讓子彈#4變得更加重要。

每次從SQL添加另一個檢索調用時,都會更頻繁地調用外部庫,這意味着您可能運行時間更長,更頻繁地分配和釋放更多內存(這會增加碎片),並可能導致數據庫成爲從閃存重新讀取。假設你可以(見第2號子彈),一旦擁有了數據,最有可能更好地保存數據。

0

當您將數據集視爲數據的「會話」時,更容易找出此問題的答案。您填寫數據集;你和他們一起工作;然後你把數據放回去,或者在你完成後丟棄它。所以你需要提問這樣的問題:

  1. 這些數據需要的電流是多少?你是否總是需要擁有最新的數據庫,還是數據庫不會頻繁更改?
  2. 你在使用什麼數據?如果您只是將它用於報告,那麼您可以輕鬆地填充數據集,運行報告,然後丟棄數據集,然後再次創建一個新數據集。無論如何,這會給你更多的當前數據。
  3. 我們在談論多少數據?你已經說過你正在處理一個相對較小的數據集,所以如果你將它全部加載到內存中並永久保存,那麼這對內存沒有什麼影響。

既然你說這是一個沒有大量數據的單用戶應用程序,我認爲你可以安全地在開始時加載所有內容,在數據集中使用它,然後關閉更新。

在這種情況下,您需要關注的主要問題是:如果應用程序由於崩潰,斷電等而異常退出,該怎麼辦?用戶會失去他所有的工作嗎?但恰巧,數據集非常容易序列化,因此您可以非常容易地實施「每隔一段時間就保存一次」的過程來將數據集內容序列化到磁盤,以便用戶不會失去大量工作。

相關問題