2012-02-14 1182 views
0

我有一個表於數據庫如下:甲骨文批量複製重複行

id min max 
--------------------- 
1  0  20 
2  21 30 
3  31 40 

我顯示在網格視圖此表(asp.net),其中用戶可以插入新的行,更新現有的和刪除任何行。這是我存儲在數據表中的所有操作。 更新,插入,刪除記錄,當用戶希望保存時,他或她按下保存按鈕,並將此修改後的數據表保存在數據庫(與填充網格視圖的位置相同的表中)。要更新數據庫,我正在使用OracleBulkCopy類。 現在的問題是,當我更新數據庫到數據庫時,它正在重複已存在的行。例如,如果我提出在網格視圖改變上面的表格,並更新到數據庫則:

id min max 
------------------ 
1  0  20 
2  21  30 
3  31  40 
1  0  20 
2  21  35 (updated) 
3  31  40 
4  41  60 (newly inserted) 

我不想這樣重複。這裏id是主鍵 ,我試圖下面的代碼OracleBulkCopy

Oracle.DataAccess.Client.OracleBulkCopy oracleBulkCopy = new Oracle.DataAccess.Client.OracleBulkCopy(DM.ConnectionString, Oracle.DataAccess.Client.OracleBulkCopyOptions.UseInternalTransaction); 
oracleBulkCopy.DestinationTableName = "RANGE"; 
oracleBulkCopy.WriteToServer(dataTable); 

回答

0

OracleBulkCopy行爲有點像SQL*Loader。它不關心重複,只是插入一切。事實上,它會在啓動之前禁用您的索引,然後再次啓用它們。例如,請參閱this的問題。解決此問題的方法是,將大容量副本複製到與目標表具有相同列的臨時表中,然後在此表中執行INSERT,因爲這可以讓您忽略重複項。

編輯:根據APC,這不會太好。但是,請進一步查看WriteToServer:您不必複製整個數據表,就可以根據DataRowState進行復制。見here。因此,您可以僅批量複製那些新行,並可能執行修改行的解決方法。如果你允許從你的數據表中刪除,那麼你將不得不分別處理它們。

+0

這種「解決方法」可能足以完成作業,但它確實不適用於真正的應用程序,即性能至關重要的應用程序。 – APC 2012-02-14 13:11:24

+0

@APC你會建議什麼? – alwaysVBNET 2014-11-06 11:27:58