我有一个程序正在执行批量复制到几个Sybase数据库表。但是,回滚事务不起作用。当单步执行逻辑时,问题似乎与事务对象有关。我现在不知所措。任何建议都会很棒。
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:'tempdb'数据库中的多语句事务中不允许使用'CREATE TABLE'命令。
答案 0 :(得分:0)
您的问题不在于回滚。问题是错误消息msg说:你不能在事务中做一个DDL语句。我不知道DDL语句的来源,但消息很清楚。 一种可能的解决方案是在问题中为数据库启用选项'ddl in tran'(使用sp_dboption)。
答案 1 :(得分:0)
sp_oledb_columns
过程生成的 CREATE TABLE
,在批量复制操作准备步骤中调用。
因此,正如RobV所说,您需要允许DDL到tempdb(从master
db执行):
sp_dboption tempdb, 'ddl in tran', 'true'