• 之前用存储过程错了。现在改正过来。


    public bool InsertInvitation(DataTable dt)
            {
                SqlTransaction transaction = null;
                try
                {
                    using (SqlConnection conn = new SqlConnection(sqlHelper.SQLConString))
                    {
    
    
                        conn.Open();
                        transaction = conn.BeginTransaction();
                        SqlBulkCopy sbc = new SqlBulkCopy(conn, SqlBulkCopyOptions.CheckConstraints, transaction);
                        //服务器上目标表的名称
                        sbc.DestinationTableName = dt.TableName;
                        sbc.BatchSize = dt.Rows.Count;
                        sbc.BulkCopyTimeout = 180;
                        sbc.WriteToServer(dt);
    
                        SqlCommand cmd = new SqlCommand();
                        cmd.CommandType = CommandType.Text;
                        cmd.Connection = conn;
                        cmd.Transaction = transaction;
                        cmd.CommandText = "insert AABB(ID)values(1)";
                        cmd.ExecuteNonQuery();
                        Convert.ToInt32("sdfs");
                        transaction.Rollback();
    
                    }
                }
                catch (Exception ex)
                {
                    transaction.Rollback();
                    LogMsg.WriteLogToApplicationFolderByMonth(ex.ToString());
                    return false;
                }
                return true;
            }

    当报异常的时候,transaction会引发“此 SqlTransaction 已完成;它再也无法使用。”

    改成下面的样子则无碍。另外,使用事务的时候,要注意将SqlTransaction赋给执行命令的SqlTransaction,如

    SqlBulkCopy sbc = new SqlBulkCopy(conn, SqlBulkCopyOptions.CheckConstraints, transaction);、cmd.Transaction = transaction;
    public bool InsertInvitation(DataTable dt)
            {
                using (SqlConnection conn = new SqlConnection(sqlHelper.SQLConString))
                {
                    SqlTransaction transaction = null;
                    try
                    {
                        conn.Open();
                        transaction = conn.BeginTransaction();
                        SqlBulkCopy sbc = new SqlBulkCopy(conn, SqlBulkCopyOptions.CheckConstraints, transaction);
                        //服务器上目标表的名称
                        sbc.DestinationTableName = dt.TableName;
                        sbc.BatchSize = dt.Rows.Count;
                        sbc.BulkCopyTimeout = 180;
                        sbc.WriteToServer(dt);
    
                        SqlCommand cmd = new SqlCommand();
                        cmd.CommandType = CommandType.Text;
                        cmd.Connection = conn;
                        cmd.Transaction = transaction;
                        cmd.CommandText = "insert AABB(ID)values(1)";
                        object i=cmd.ExecuteNonQuery();
    if(Convert.toInt32(i)<=0){
    transaction.Rollback();
    }
    transaction.Commit(); } catch (Exception ex) { transaction.Rollback(); LogMsg.WriteLogToApplicationFolderByMonth(ex.ToString()); return false; } } return true; }
  • 相关阅读:
    RDA安装
    关闭SELinux
    Linux下开启关闭防火墙
    长事务管理
    增加复制表
    Python使用property函数定义的属性名与其他实例变量重名会怎么样?
    Python使用property函数定义属性访问方法如果不定义fget会怎么样?
    Python使用property函数和使用@property装饰器定义属性访问方法的异同点分析
    第8.18节 Python类中内置析构方法__del__
    Python中的列表解析和列表推导是一回事吗?
  • 原文地址:https://www.cnblogs.com/hougelou/p/3546125.html
Copyright © 2020-2023  润新知