Oracle批量复制重复行

时间:2012-02-14 06:15:45

标签: asp.net oracle oracle11g

我有一个数据库表如下:

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);

1 个答案:

答案 0 :(得分:0)

OracleBulkCopy有点像SQL*Loader。它不关心重复,只是插入一切。实际上,它会在启动之前禁用索引,然后再启用它们。例如,请参阅this问题。解决方法是,您可以批量复制到与目标表具有相同列的临时表中,然后在此表中执行INSERT,因为这样可以忽略重复项。

编辑:根据APC,这不会扩展得太好。但是,请进一步了解WriteToServer:您不必复制整个数据表,您可以根据DataRowState进行复制。见here。因此,您只能批量复制那些新行,并且可能会为修改后的行执行变通方法。如果您允许从数据表中删除,那么您也必须单独处理它们。