2009-07-21 150 views
0

外部トランザクションをロールバックしようとしましたが、OracleBulkCopy()を中止しようとしましたが、まだすべての行が挿入されました。誰でもこれを行う方法を知っていますか?OracleBulkCopy()挿入行をロールバックする方法はありますか。

ケース1:動作しませんでした。とにかくすべての行が挿入されます。

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

ケース2:OracleRowsCopiedEventHandlerデリゲートを使用して、このコールバックでtrueOracle.RowsCopiedEventsArgs.Abortを設定し、catchブロックでトランザクションにロールバックします。どちらもうまくいきませんでした。 Abortコールの前に挿入されたものは、すでにデータベースに入っているようです。 OracleBulkCopy()SqlBulkCopy()よりも劣っています。

ありがとうございました。ホアン

答えて

0

あなたは例外InvalidOperationExceptiondocumentationクレームとして上げられるかどうかを確認するために代わりOracleBulkCopyOptions.DefaultOracleBulkCopyOptions.UseInternalTransactionを設定しようとしたことがありますか?

+0

これは私の質問とは関係ありません。バッチごとの内部トランザクションを使用することは、挿入された行の大部分をロールバックするのに役立ちません。基本的に私はすべてをロールバックしたい。たとえば、最初の50Kがすでにコミットされている間に、最後の50Kではなくすべてをロールバックしたい、100K行と途中のどこかに挿入する必要があるとします。 –

+0

私は知っています。私はすべてが正常に動作しているかどうかを確認するテストについて述べました。ドキュメントによると、UseInternalTransactionを使用してBeginTransactionを使用すると、例外が発生します。例外が発生していない場合は、トランザクションが開始されていない可能性があります。 – FerranB

+0

はい、UserInternalTransactionを使用すると例外が発生します。私はそれを試みた。また、CommittableTransactionを明示的な分散トランザクションとして使用しようとしました。これも役に立たなかった。 –

1

OK、私はオラクルから答えを得ました。現在、OracleBulkCopyではトランザクションはサポートされていません。

関連する問題