我想在執行潛在冗長的數據庫操作時向用戶顯示詳細的進度信息。特別是,當插入/更新數百KB或MB數量級的數據時。如何在使用ADO.NET時最好地顯示進度信息?
目前,我正在使用內存中的DataTables和DataRows,然後通過TableAdapter.Update調用與數據庫同步。這工作正常,很花哨,但單一的電話幾乎沒有機會收集任何種類的進度信息以顯示給用戶。我不知道有多少數據通過網絡傳輸到遠程數據庫或其進程。基本上,我所知道的是當Update返回並假定完成時(禁止任何錯誤或異常)。但這意味着我能展示的只有0%,然後是暫停,然後是100%。
我可以統計行數,甚至到目前爲止還有多少實際上是修改或添加的,我甚至可能會根據每列的數據類型計算每個DataRow的估計大小,對於值類型使用sizeof像int和檢查字符串或字節數組等東西的長度。這樣,我可以在更新之前確定估計的總傳輸大小,但是一旦TableAdapter調用Update,我仍然無法獲得任何進度信息。
我堅持使用不確定的進度條或鼠標等待光標?我是否需要從根本上改變我們的數據訪問層才能夠連接到這種信息?即使我無法把它傳遞給精確的KB(例如web瀏覽器文件下載進度條),我是否至少可以知道每個DataRow/DataTable何時完成?
如何最好地展示這種使用ADO.NET的進度信息?
不使用SqlBulkCopy嘗試插入所有行作爲新行?我的意思是,如果調用WriteToServer時傳遞給它的DataTable有一些RowState == Modified的行,那麼它是更新這些行還是插入新的PK?如果KeepIdentity已啓用,該怎麼辦?如果它試圖插入和PK是相同的,那麼我想它會拋出一個SqlException。也許這值得另外一個問題。 MSDN文檔不具體... – 2010-04-11 07:34:24
沒關係。當MSDN文檔失敗時,MSDN博客即可解救。 http://blogs.msdn.com/irenak/archive/2006/02/10/529553.aspx – 2010-04-11 07:41:35
@Yadyn:'SqlBulkCopy'封裝了一個不更新的批量插入操作,這就是你需要使用臨時存儲的原因表。一般來說,如果讓'DataSet'和相關的類與框架中的其他任何數據類一起工作,你就不會有太多的運氣 - 你可能不得不開始擺脫這些,因爲它們是基於將整個記錄集加載到內存而不是從TDS流式傳輸的概念。 – Aaronaught 2010-04-11 15:21:04