2013-04-24 64 views
0

我仍然在C#和SQL Server的學習曲線中,所以請原諒我的'綠色'。C#中的數據處理 - 最佳方法?

這裏是我的情況:

我有10,000行的EMPLOYEE表。這些員工中的每一個在TRANSACTIONS表中都有交易。

事務表有薪水的元素,如基本工資,津貼代理,加班時間等,也有工資中扣除像事先扣除,一些貸款(含利息)和儲蓄(養老,社會保障儲蓄等

我需要通過每個員工的交易和計算稅收,貸款未清餘額,更新餘額儲蓄,轉換時間爲支付/扣除和一些其他的東西。

這種處理將會給我一個新的行集的每個員工都有一個週期標記(例如,2013年4月至2013年4月)。我需要將其存儲在HISTORY表中供將來參考。

處理整個10,000員工表及其交易的最佳方法是什麼?

我被告知通過閱讀器將整個表格拉進內存不是很好的做法,我同意。

我是否不斷從數據庫中提取員工,處理他們的交易,並將歷史記錄提交給數據庫?拉動下一個等等?

呼叫到後端太多?

(EF不是我的選擇,還是做原始的SQL ADO.NET中)

我會明白任何幫助。

+3

如果您只需要很少計算此稅項,爲何不編寫一個Sql服務器存儲過程來執行此操作?然後,你的C#程序可以讀取「稅收歷史」表,或啓動另一個重新計算(調用Sproc),如果需要... – Mansfield 2013-04-24 11:14:00

+2

是否有任何理由不在數據庫中完全執行數據操作而不涉及。淨? – 2013-04-24 11:14:18

+0

@將A:我將有超過50個數據庫用於不同的工資單。在每月的事情處理。所以在我看來,我想在客戶端進行處理。 – 2013-04-24 12:52:52

回答

2

10000行不多。如果沒有一些寬泛的varchar或二進制列,內存很容易處理。不要被良好的實踐「規則」完全鎖定。另一方面,考慮stored procedure。然後所有處理將在服務器上本地完成。

編輯:如果以上都不是選項,請嘗試傳輸結果。例如,在閱讀您的查詢時,將每行保存在ConcurrentQueue或類似的東西中。在執行查詢之前,請啓動另一個線程或BackgroundWorker,它會檢查隊列中是否有新項目,並同時將結果保存在另一個SqlConnection上。當查詢完成時,工作將完成並且隊列具有Count 0.

+0

我的應用程序將處理超過50個不同的數據庫(儘管相同),但每個數據庫將針對一個客戶帳戶。所以sp維護可能是一個問題 - 我想也許我應該在客戶端有處理登錄。 – 2013-04-24 12:55:20

1

使用ROW_NUMBER()檢出。程序可以使用它來允許大型表一次使用'x'行來瀏覽。那麼你可以想象用同樣的方法來批量處理,比如1000行。

請參閱this鏈接瞭解更多信息。

+0

我已查看鏈接。我會做一些測試,看看它是否適合我的情況。儘管如此。 – 2013-04-24 14:09:02

相關問題