2011-03-11 143 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