AseBulkCopy

时间:2017-12-08 17:08:59

标签: c# sybase sqlbulkcopy

我有一个程序正在执行批量复制到几个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'命令。

2 个答案:

答案 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'