У меня есть программа, которая выполняет массовую копию в несколько таблиц Sybase db. Однако транзакция отката не работает. При переходе по логике проблема, похоже, связана с объектом транзакции. Сейчас я в недоумении. Будем признательны любому совету.
public static void SqlBulkCopy()
{
try
{
conn.Open();
using (transaction = conn.BeginTransaction())
{
using (bulkCopy = new AseBulkCopy(conn, AseBulkCopyOptions.Default, transaction))
{
BulkCopying("DB_TABLE_1", dataTable1);
BulkCopying("DB_TABLE_2", dataTable2);
BulkCopying("DB_TABLE_3", dataTable3);
transaction.Commit();
}
}
}
catch (Exception ex)
{
throw ex;
}
finally
{
conn.Close();
}
}
private static void BulkCopying(string dbTableName, DataTable dtSourceName)
{
try
{
bulkCopy.BatchSize = 1000;
bulkCopy.BulkCopyTimeout = 720;
bulkCopy.NotifyAfter = 1000;
bulkCopy.DestinationTableName = dbTableName;
bulkCopy.WriteToServer(dtSourceName);
}
catch (Exception ex)
{
transaction.Rollback();
throw ex;
}
}
Это ошибка, которую я получил:
Sybase.Data.AseClient.AseException: команда «CREATE TABLE» не допускается в транзакции с несколькими операциями в базе данных «tempdb».
CREATE TABLE
сгенерированный процедурой sp_oledb_columns
, вызываемой на этапах подготовки операции массового копирования.
Итак, как сказал RobV, вам нужно разрешить DDL для tempdb (выполнить от master
db):
sp_dboption tempdb, 'ddl in tran', 'true'