C#中事务的操作

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

如何使用事务

1.创建
SqlTransanction wmsin = conn.BeginTransaction(); 
创建事务对象,需要注意的是我们创建的时候必须保证数据库是打开的,也就是在Open下才可以创建。

2.挂载
cmd.Transaction = wmsin;
把事务对象挂到命令对象上,让命令执行带有事务的功能。

执行完挂载后,我们对数据进行增删改的操作。然后是执行完操作后,当成功的话我们提交事务,当失败的话,我们回滚事务。
成功: wmsin.Commit();//提交
失败:wmsin.Rollback();//回滚

举个实际上的例子:

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;
            }
        }
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
C#使用Dapper进行事务批量操作,可以按照以下步骤进行: 1. 开启事务:使用Dapper的Transaction属性可以开启事务。 ``` using (var cn = new SqlConnection(connectionString)) { cn.Open(); using (var transaction = cn.BeginTransaction()) { try { // 执行批量操作 transaction.Commit(); } catch { transaction.Rollback(); throw; } } } ``` 2. 执行批量操作:使用Dapper的Execute方法可以执行批量操作。 ``` using (var cn = new SqlConnection(connectionString)) { cn.Open(); using (var transaction = cn.BeginTransaction()) { try { string sql = "INSERT INTO MyTable (Column1, Column2) VALUES (@Column1, @Column2)"; List<MyData> data = new List<MyData>(); // 添加数据到data列表 cn.Execute(sql, data, transaction); transaction.Commit(); } catch { transaction.Rollback(); throw; } } } ``` 其,MyData是一个自定义的数据模型,包含要插入到数据库的数据。 3. 使用SqlBulkCopy进行批量操作:Dapper也支持使用SqlBulkCopy进行批量操作,可以提高批量操作的效率。 ``` using (var cn = new SqlConnection(connectionString)) { cn.Open(); using (var transaction = cn.BeginTransaction()) { try { using (var bulkCopy = new SqlBulkCopy(cn, SqlBulkCopyOptions.Default, transaction)) { bulkCopy.DestinationTableName = "MyTable"; DataTable table = new DataTable(); // 添加数据到table bulkCopy.WriteToServer(table); } transaction.Commit(); } catch { transaction.Rollback(); throw; } } } ``` 以上就是使用Dapper进行事务批量操作的基本步骤。需要注意的是,批量操作可能会影响数据库性能,应该在适当的时候进行优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晚风偷吻云朵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值