2012-11-15 49 views
0

我正在編寫一個C#應用程序來從網站上抓取數據,然後用它來更新數據庫表。將程序生成的數據與存儲在數據庫中的數據進行比較的最佳方法?

我刮的數據與數據庫中的10行有關。如果數據實際發生了變化,我們只想插入數據。我已經編寫了SQL procs來進行更改,但我不確定如何實現第一階段 - 檢查程序生成的數據(從網站上抓取)是否與SQL Server中已存儲的數據不同。

我目前的做法是在我的程序中使用表示數據的類,填充這些對象的實例字典(在這種情況下將會有10個鍵值對),填充網站數據,然後抓取SQL表數據,迭代所有10行,再次使用我的類創建另外10個對象,然後使用我在數據類中寫入的名爲getHash()的函數比較兩組字典對象,例如:

websitedict.get(key1).getHash() == dbdict.get(key1).getHash()

+0

請給我們架構,理想情況下的一些例子(即使它是虛構的)數據。你打算更新現有記錄嗎?您是否打算將現有記錄標記爲存檔並插入新記錄?如果一個鍵值對改變了,你是想要替換/更新所有的鍵值對,還是隻更改那些鍵值對?等等等等? – MatBailie

+0

@Dems,我有10個對象 - 每個對象有5個字段。我只想更新數據庫中的相應字段,如果從網站抓取生成的相應字段已更改。 – mezamorphic

+0

'請給我們架構,理想情況下舉一些例子(即使它是虛構的)數據。「 – MatBailie

回答

1

你想在哪方面做得最好?

SQL調用,CPU使用率,內存使用率,CPU和SQL服務器之間的帶寬,最容易閱讀,容易維護,等等...

在你目前的做法

一個內存改進是有dbdict是Dictionary<keytype, int>(),並且只存儲其中的GetHash()值。

或可能存儲在數據庫中的GetHash()值,所以你可以做類似:

update table1 set col1 = "newvalueCol1", col2 = "newvalueCol2", colHash = @newHash 
where id = @key1 
    and colHash <> @newHash 

以外,我覺得我需要了解更多的情況,以幫助更多的(什麼是太例如:代碼,模式,更新)

0

爲什麼過程10行,如果有變化對第1行

Select count(*) from table1 where col1 <> "newVal1" or col2 <> "newVal2" ... 

Select count(*) from table2 where col1 <> "newVal1" or col2 <> "newVal2" ... 

在你的國家,插入數據,但隨後在評論你的狀態更新的問題。

如果更新那麼簡單

更新表1組COL1 = 「newvalueCol1」,其中的col1 <> 「newvalueCol1」

它實際上是更有效地

update table1 set col1 = "newvalueCol1", col2 = "newvalueCol2" 
where col1 <> "newvalueCol1" 
    or col2 <> "newvalueCol2" 

一旦你把鎖如果只有一個發生了變化,那麼兩者更新的開銷都很小。

相關問題