2011-03-11 76 views
1

C#.Net我正在使用OracleBulkCopy將數據複製到聲明爲提交時刪除的全局臨時表。所以當我使用OracleBulkCopy.WriteToServer(DataReader)時。它承諾我正在失去所有的數據。如何防止這一點?OracleBulkCopy自動提交

+0

你能告訴,你爲什麼要使用全局臨時表而不是常規表嗎? – 2011-03-12 18:59:59

+0

@bernd_k因爲現有的應用程序都以相同的方式工作。將數據從源複製到臨時表並運行存儲過程將數據從臨時表移動到永久。這是通過使用中間層完成的,其中多個線程同時訪問全局臨時表,因此使用提交時刪除,因此不會有2個會話共享數據。 – 2011-03-15 14:29:58

回答

2

OracleBulkCopy似乎不支持事務。自動提交永遠不會很聰明,使用更容易控制的方式進行復制,例如使用批量插入。

OPEN z; 
LOOP 
    FETCH z BULK COLLECT INTO z_array LIMIT z_array_size; 

    FORALL i IN 1..z_array.COUNT 
    INSERT INTO t2 VALUES z_array(i); 

    EXIT WHEN z%NOTFOUND; 
END LOOP; 
+0

你的意思是說生成動態插入語句。我們已經在使用它,只是想嘗試OracleBulkCopy,因爲我認爲它可能會更快。 – 2011-03-15 14:32:03

+0

是的,但使用如圖所示的批量插入。 OracleBulkCopy可能會快一點,也許可能不會。我不確定。大容量插入表現非常好。 – 2011-03-15 20:26:21

0

無論如何將全局臨時表聲明爲在使用.NET時提交時刪除不是好主意。

更好的做法是在做任何你想做的事情之前從gtt中刪除,並讓它在提交之後保持原樣。調試也變得更容易。

+2

@bernd_K:表現最明智的做法是從這樣的表中刪除。忘記數據並通過提交清理。在這種情況下,數據只是以非常有效的方式「蒸發」。 – 2011-03-12 17:21:59

+0

@bernd_K:如果我們不使用提交時刪除,則會出現問題,因爲多個線程同時訪問同一個全局臨時表。 – 2011-03-15 14:31:06

+0

和所有線程使用相同的oracle會話? – 2011-03-15 15:25:19