2010-11-25 72 views
1

我正在使用SqlBulkCopy進行轉換。我目前有一個IList集合的類,基本上我可以做一個轉換到DataTable與SqlBulkCopy一起使用。3條記錄具有相同的ID,但使用SqlBulkCopy更改不同的列

問題是我可以有3個記錄具有相同的ID。

讓我解釋一下。這裏有3條記錄

ID  Name   Address 
1  Scott  London 
1  Mark   London 
1     Manchester 

基本上我需要按順序插入它們..因此,我插入記錄1,如果不存在的話,那麼如果存在下一個記錄,我需要更新記錄,而不是插入新的1(通知ID仍然是1),所以在第二條記錄的情況下,我將ID列中的兩個列名稱和地址都替換爲。

最後在第3條記錄中,您注意到名稱不存在,但其身份證1,並有一個曼徹斯特的地址,所以我需要更新記錄,但不更改名稱,但更新曼徹斯特..因此第3條記錄ou ld使id1 =

ID  Name  Address 
1  Mark  Manchester 

任何想法我可以做到這一點?我很茫然。

謝謝。

編輯

好一點點更新。在使用SQLbulkCopy之前,我將管理和合並我的記錄。是否有可能獲得成功和失敗的清單...或者是全是或不是全部的情況?我認爲沒有其他的替代SQLbulkCopy,但做更新?

這將是理想的能夠插入一切和失敗的插入到臨時表...因此,我只需要擔心糾正失敗表中的人,因爲我知道其他人都行

+0

(將更新答案重新編輯) – 2010-11-25 13:15:07

回答

0

,因爲你需要的數據處理成一個DataTable反正(除非你正在寫一個自定義的IDataReader),你應該把它們合併給予SqlBulkCopy前的記錄;例如(在僞代碼):

/* create empty data-table */ 
foreach(row in list) { 
    var row = /* try to get exsiting row from data-table based on id */ 
    if(row == null) { row = /* create and append row to data-table */ } 
    else { merge non-trivial properties into existing row */ 
} 

然後傳遞到DataTableSqlBulkCopy一旦你有所需的數據。


重新編輯;在這種情況下,我會上傳到一個臨時表(只是一個常規表,它具有像上載數據那樣的架構,但通常沒有外鍵等),然後使用常規TSQL將數據移動到事務表中。除了完整的TSQL支持外,還可以更好地記錄操作。特別是,也許看看INSERTOUTPUT子句,它可以幫助複雜的批量操作。

+0

謝謝,我已經uddated我的問題 – Martin 2010-11-25 13:06:07

0

您無法使用批量複製(批量插入)進行更新,只能插入。由此得名。

您需要在插入數據之前修複數據。如果這意味着您對已存在的行進行了更新,則無法插入這些行,因爲這會產生密鑰衝突。

您可以批量插入到臨時表中,然後運行相應的插入或更新語句,僅插入新行並針對其他行執行更新語句,或者在提取並更新數據後刪除預先存在的行在重新插入之前。

但是沒有辦法說服批量複製來更新現有的行。

+0

謝謝,我已更新我的問題 – Martin 2010-11-25 13:05:39

相關問題