• C#中事务的操作


    在使用C#开发中,我们经常对数据库操作,所以会用到事务。前面的文章中我写了使用FreeSql框架如何使用事务,今天我们说一下在C#中如果是使用的原生SQL怎么使用事务。

    如何使用事务

    1.创建
    SqlTransanction wmsin = conn.BeginTransaction(); 
    创建事务对象,需要注意的是我们创建的时候必须保证数据库是打开的,也就是在Open下才可以创建。
    
    2.挂载
    cmd.Transaction = wmsin;
    把事务对象挂到命令对象上,让命令执行带有事务的功能。
    
    执行完挂载后,我们对数据进行增删改的操作。然后是执行完操作后,当成功的话我们提交事务,当失败的话,我们回滚事务。
    成功: wmsin.Commit();//提交
    失败:wmsin.Rollback();//回滚
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    举个实际上的例子:

    public void chengpinin()
            {
                String connstrWMS = ConfigurationManager.ConnectionStrings["ConnectionStringWms"].ConnectionString;//wms数据库
                String connstrInter = ConfigurationManager.ConnectionStrings["ConnectionStringInter"].ConnectionString;//中间库
                SqlConnection connInter = new SqlConnection(connstrInter);//中间库
                SqlConnection connWms = new SqlConnection(connstrWMS);//wms数据库
                string batch_no = "";string quantity = "";string remark = "";string flag = "";
                string matno ="";
                string lotno = "";
                string demo1 = "";
                string demo2 = "";
                int AFlag = 0;
                try
                {
                    DataSet ds_aimer_to_wms_inter = new DataSet();
                    DataSet ds_aimer_to_wms_inter2 = new DataSet();
                    DataSet wms = new DataSet();
                    connInter.Open();
                    DataSet ds = new DataSet();
                    string sql = string.Empty;
                    sql = sql + " select * from A_FG_PORT_ENTYR where flag = '0'   ";
                    ds_aimer_to_wms_inter = Getdata_bymemo(sql);
                    connInter.Close();
                    if (ds_aimer_to_wms_inter.Tables[0].Rows.Count <= 0)
                    {
                        return;
                    }
                    connInter.Open(); 
                    connWms.Open();
                    //循环中间库数据库数据
                    for (int j = 0; j < ds_aimer_to_wms_inter.Tables[0].Rows.Count; j++)
                    {
                        batch_no = ds_aimer_to_wms_inter.Tables[0].Rows[j]["batch_no"].ToString();
                        quantity = ds_aimer_to_wms_inter.Tables[0].Rows[j]["quantity"].ToString();
                        remark = ds_aimer_to_wms_inter.Tables[0].Rows[j]["remark"].ToString();
                        flag = ds_aimer_to_wms_inter.Tables[0].Rows[j]["flag"].ToString();
                       
                        string sql2 = string.Empty;
                        sql2 = sql2 + " select * from A_FG_PORT_ENTYR_BOX where batch_no = '"+batch_no+"'";
                        ds_aimer_to_wms_inter2 = Getdata_bymemo(sql2); 
                        //这就是第一步 先创建
                        SqlTransaction sqlwmsTran = connWms.BeginTransaction();//创建添加事务
                        SqlTransaction sqlmesTran = connInter.BeginTransaction();//创建修改事务
                        //
                        if (ds_aimer_to_wms_inter2.Tables[0].Rows.Count != 0)
                        {
                            for (int y = 0; y < ds_aimer_to_wms_inter2.Tables[0].Rows.Count; y++)
                            {
                                string BARCODE = ds_aimer_to_wms_inter2.Tables[0].Rows[y]["BARCODE"].ToString();
                                matno = BARCODE.Substring(6, 2);
                                lotno = BARCODE.Substring(8, 2);
                            }
                            string add = "insert into log_erp_in(trfno,ORDNO,ITMNO,RECTYPE,MATNO,MUNIT,QUANT,QUANT0," +
                                "JIAN,CFLAG,BATCH,LOTNO,SUPPLY,WORKS,STORE,SECTN,PRDAT,QUDAT,PONO,POITEM,STYPE,ATTACHMENT," +
                                "VCDSCR,PRICE,KEEPER,STATU,TKDAT,COMDAT,OPUSER,USERID,DEMO1,DEMO2,DEMO3,DEMO8) " +
                                "values('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}','{9}','{10}','{11}','{12}','{13}','{14}'," +
                                "'{15}','{16}','{17}','{18}','{19}','{20}','{21}','{22}','{23}','{24}','{25}','{26}','{27}','{28}','{29}','{30}','{31}','{32}','{33}')";
                            add = string.Format(add, batch_no, batch_no, batch_no.Remove(0, batch_no.Length - 4), "1", matno, "1", quantity, "0.000000", "1", "1",
                                batch_no, lotno, "604", "22", "604", "G", DateTime.Now.ToString(), DateTime.Now.ToString(), "-", "-", "-", "-", "-", "1",
                                "", "", DateTime.Now, Convert.ToDateTime("2050-01-01 00:00:00.000"), "a", "a", "ALL", "ALL", "-", "erp");
                            SqlCommand cmd = new SqlCommand(add, connWms);
                            //这里是第二步  挂载
                            cmd.Transaction = sqlwmsTran;//把事务对象挂到命令对象上,让命令执行带有事务的功能
                            //
                            if (cmd.ExecuteNonQuery() <= 0)
                            {
                                AFlag = AFlag + 1;//如果添加失败 
                            }    
                        }
                        string updatezt = "update A_FG_PORT_ENTYR set FLAG = 1 where BATCH_NO = '" + batch_no + "'";
                        SqlCommand cmd2 = new SqlCommand(updatezt, connInter);
                        cmd2.Transaction = sqlmesTran;
                        if (cmd2.ExecuteNonQuery() <= 0)
                        {
                            AFlag = AFlag + 1; //修改失败 
                            LogHelper log = new LogHelper("LogTest");
                            log.WriteLine("入库状态修改失败,sql语句:" + updatezt);
                        }
                        if (AFlag == 0)
                        {
                        //执行成功后 我们提交事务
                            sqlwmsTran.Commit();
                            sqlmesTran.Commit();
                       //
                        }
                        else
                        { 
                        //执行失败后 我们回滚事务
                            sqlwmsTran.Rollback();
                            sqlmesTran.Rollback();
                        //
                        }
                    }
                    connWms.Close(); 
                    connInter.Close();
                }
                catch (Exception ex)
                {
                    LogHelper log = new LogHelper("LogTest");
                    log.WriteLine("入库异常:" + ex.Message);
                    string a = ex.Message;
                    connInter.Close();
                    connWms.Close();
                    connInter = null;
                    connstrWMS = null;
                }
            }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
  • 相关阅读:
    Eureka简介及简单使用
    Kustomize 生产实战-注入监控 APM Agent
    美国站群服务器如何解决跨国运营中的网络延迟问题?
    Mall电商实战项目全面升级,支持最新版SpringBoot,彻底解决循环依赖...
    里奥哈大使撰文 | 来一场云旅行吧,盘点里奥哈那些美轮美奂的酒庄~
    【iOS ARKit】网络传输 ARWorldMap
    【Unity入门计划】2D游戏中遮挡问题的处理方法&伪透视
    深入理解Python中的多线程与多进程编程
    IT项目管理的“金科玉律”是否可信
    面试真题:消费者积压问题的答案
  • 原文地址:https://blog.csdn.net/qq_43434929/article/details/127850572