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
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. –
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
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. –