2012-02-14 81 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