2009-07-21 6 views
0

Ich habe versucht, externe Transaktion zurückzusetzen und auch versucht, OracleBulkCopy() abzubrechen, aber es noch alle Zeilen eingefügt. Weiß jemand, wie man das macht?Wie Rollback OracleBulkCopy() Zeilen eingefügt?

Fall 1: Hat nicht funktioniert. Alle Zeilen wurden trotzdem eingefügt.

OracleConnection connection = new OracleConnection(ConnectionString); 
connection.Open(); 
OracleTransaction trans = connection.BeginTransaction(); 
OracleBulkCopy bulkCopy = new OracleBulkCoopy(connection,OracleBulkCopyOptions.Default); 
bulkCopy.DestinationTableName = "SomeTable";  
bulkCopy.WriteToServer(SomeDataTable); 
trans.Rollback(); 

Fall 2: in Fangblock Verwenden OracleRowsCopiedEventHandler delegieren und in diesem Callback gesetzt Oracle.RowsCopiedEventsArgs.Abort zu true und dann auf der Rollback-Transaktion. Hat auch nicht funktioniert. Es scheint, dass jede Einfügung vor dem Abbruch-Aufruf bereits in der Datenbank ist. OracleBulkCopy() ist schlechter als SqlBulkCopy() wie ich es sehe.

Danke. Hoang

Antwort

0

Haben Sie wird OracleBulkCopyOptions.UseInternalTransaction statt OracleBulkCopyOptions.Default zu sehen, ob die Ausnahme InvalidOperationException wie die documentation Ansprüche angehoben zu setzen versucht?

+0

Das hat nichts mit meinen Fragen zu tun. Die Verwendung der internen Transaktion pro Batch hilft mir nicht beim Rollback der meisten eingefügten Zeilen. Grundsätzlich möchte ich alles zurücksetzen. Nehmen wir an, Sie müssen 100K Zeilen einfügen und irgendwo in der Mitte möchten Sie alles zurücksetzen, nicht die letzten 50K, während die ersten 50K bereits festgeschrieben sind. –

+0

Ich weiß. Ich sagte über einen Test, um zu sehen, ob alles gut funktioniert. Wie die Dokumentation sagt, wenn Sie UseInternalTransaction haben und BeginTransaction verwenden, wird eine Ausnahme ausgelöst. Wenn die Ausnahme nicht ausgelöst wird, liegt das Problem möglicherweise darin, dass die Transaktion nicht gestartet wird. – FerranB

+0

Ja, es löst die Ausnahme aus, wenn Sie die UserInternalTransaction verwenden. Ich habe es versucht. Ich habe auch versucht CommittableTransaction als explizite verteilte Transaktion zu verwenden. Das hat auch nicht geholfen. –

1

OK, ich habe die Antwort von Oracle bekommen. Die Transaktion wird derzeit nicht von OracleBulkCopy unterstützt.