1

OracleBulkCopyOptions.DefaultOracleBulkCopyOptions.UseInternalTransactionの違いと、間に一括挿入エラーが発生した場合にすべてのレコードをロールバックする方法を誰かが説明できますか?

OracleBulkCopyを使用して、Oracle データベースに一括挿入 (レコードの範囲は 100000 から 500000 まで変化します) しています。私の要件は、すべてのレコードを db に挿入するか、どのレコードも db に挿入しない (すべてのレコードをロールバックする) ことです。BatchSizeとして 25000 を指定し、 BulkCopyTimeoutとして 150 秒を指定しています。以下は私の現在のコードブロックです。

public bool WriteExcelDataToServerRouteOne(DataTable excelTable)
        {
            var columnMapping = from table in excelTable.Columns.Cast<DataColumn>() select new OracleBulkCopyColumnMapping(table.ColumnName, table.ColumnName);
            using (var bulkcopy = new OracleBulkCopy(ConnectionString, OracleBulkCopyOptions.Default))
            {
                bulkcopy.DestinationTableName = DestinationTable;
                foreach (var mapping in columnMapping)
                    bulkcopy.ColumnMappings.Add(mapping);
                bulkcopy.BulkCopyTimeout = TimeOut.Value;
                bulkcopy.BatchSize = BatchSize.Value;
                bulkcopy.WriteToServer(excelTable);
            }
            return true;
        }
4

1 に答える 1

3

OracleBulkCopy は、すべてのレコードのトランザクションをサポートするわけではありません。指定されている場合UseInternalTransactionは、バッチのトランザクションのみをサポートします。

OracleBulkCopy クラスから

  • BatchSize > 0 でUseInternalTransaction 一括コピー オプションが指定されている場合、一括コピー操作の各バッチはトランザクション内で発生します。一括コピー操作を実行するために使用される接続が既にトランザクションの一部である場合、InvalidOperationException 例外が発生します。
  • BatchSize > 0 で UseInternalTransaction オプションが指定されていない場合、行はサイズ BatchSize のバッチでデータベースに送信されますが、トランザクション関連のアクションは実行されません。

あなたの質問について:

OracleBulkCopyOptions.Default と OracleBulkCopyOptions.UseInternalTransaction の違いは何ですか?

デフォルト: バッチにトランザクションを使用しません。UseInternalTransaction: バッチ サイズが 0 より大きい場合、バッチのトランザクションをサポートします。

参照: OracleBulkCopyOptions列挙

于 2012-12-26T05:09:06.133 に答える