2012-01-02 33 views
0

如果我有一個xml文件(上傳到我的服務器),我做了一些處理從它獲取數據,然後將這些數據存儲在我的數據庫中。如何只檢測上傳文件中的變化?

如果用戶進行了一些更改(插入,更新,刪除),然後再次將文件上傳到我的服務器。有沒有什麼辦法來檢測更改(插入,更新,刪除)來更新我的數據庫,而不是僅僅刪除所有數據並重新插入它們。特別是,有一些數據取決於現有數據(參照完整性)和如果我刪除所有的數據,家屬將被刪除(級聯刪除)!

注:

  • 我存儲的文件哈希值,所以我知道如果有一些變化,因爲最後上傳的發生 。
+1

一旦上傳這個XML文件,你在做什麼?你解析它嗎?你如何將數據存儲到數據庫中? XML文件的結構是什麼?你的數據庫的結構是什麼?在您的問題變爲*可回答之前需要回答的許多問題*。 – 2012-01-02 17:24:51

+0

是的我解析數據並將它們存儲在數據庫中。我使用'xmlreader'來讀取每個元素的屬性,然後存儲在數據庫中的等效實體中 – 2012-01-02 17:26:59

+0

答案反映了您的問題的詳細程度:是的,有一種方法可以檢測到變化。 – RickNZ 2012-01-02 23:13:51

回答

3

正如Darin在他的評論中指出的,這很大程度上取決於XML文件和數據庫的結構和內容。

原則上,您現在刪除一定數量的表的一組行,然後(重新)插入另一組行。

如果你只是想更新你的數據庫,你可以 - 爲每個表 - 第一確定您目前會刪除所有行(即做一個SELECT ... WHERE而不是DELETE ... WHERE),準備一組行,你會插入和比較這些兩套(讓我們稱之爲DELETEINSERT):

  • 行均只有在DELETE必須從數據庫中刪除
  • 行均只有INSERT組必須插入
  • 行均在INSERTDELETE組必須進行更新。

但是,如前所述,如何以及以何種順序執行這些操作取決於您的具體數據結構。例如。如果表之間存在依賴關係(即父子關係),則父實體的刪除操作也需要照顧孩子(可能在您的外鍵定義中使用ON DELETE CASCADE子句)。在這種情況下,您還應該爲其子表處理父表。

+0

'SELECT ... WHERE' 什麼是通過我的表和xml文件進行比較的標準。 – 2012-01-02 17:37:20

+1

這取決於您;)您需要能夠識別您的數據庫中的XML數據,即您必須爲xml文件和數據庫定義某種*主鍵*。這個主鍵可能取決於您的數據:如果您插入例如個人資料,你可能會使用姓氏和姓氏的組合。然後你可以做一個'SELECT forename +''+ surename FROM persons',並且將它與你的XML文件中的同名/姓氏組合進行比較。 – MartinStettner 2012-01-02 17:50:44