Я попытался отменить внешнюю транзакцию, а также попытался прервать 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
делегат и в этом обратном установить Oracle.RowsCopiedEventsArgs.Abort
в true
, а затем откатить на операции в блоке поймать. Не работает. Кажется, что любая вставка перед вызовом Abort уже находится в базе данных. OracleBulkCopy()
уступает SqlBulkCopy()
тем, как я его вижу.
Спасибо. Хоанг
Это не имеет ничего общего с моими вопросами. Использование внутренней транзакции для каждой партии не поможет мне откатить большую часть вставленных строк. В основном я хочу откат всего. Скажем, вам нужно вставить строки 100K, а где-то посередине вы хотите откатить все не последние 50K, в то время как первые 50K уже зафиксированы. – 2009-07-22 14:07:29
Я знаю. Я сказал о тестировании, чтобы убедиться, что все работает нормально. как говорится в документации, если вы используете UseInternalTransaction и используете BeginTransaction, возникает исключение. Если исключение не возникает, может возникнуть проблема в том, что транзакция не запущена. – FerranB
Да, это возбуждает исключение, если вы используете UserInternalTransaction. Я пробовал это. Также я попытался использовать CommittableTransaction как явную распределенную транзакцию. Это тоже не помогло. – 2009-07-22 17:11:27