【问题标题】:C# transaction error in AseBulkCopyAseBulkCopy 中的 C# 事务错误
【发布时间】:2018-05-22 23:28:46
【问题描述】:

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

【问题讨论】:

    标签: c# sybase sqlbulkcopy


    【解决方案1】:

    您的问题不在于回滚。问题就像错误消息所说的那样:您不能在事务中执行 DDL 语句。我不知道那个 DDL 语句来自哪里,但信息很清楚。 一种可能的解决方案是为有问题的数据库启用选项“ddl in tran”(使用 sp_dboption)。

    【讨论】:

      【解决方案2】:

      CREATE TABLEsp_oledb_columns 过程生成,在大容量复制操作准备步骤期间调用。

      所以正如RobV所说,你需要允许DDL到tempdb(从masterdb执行):

      sp_dboption tempdb, 'ddl in tran', 'true'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多