关于FreeSQL事务提交存储过程遇到的问题

  • binGe博客
  • FreeSql
  • 2023/11/30 10:14:00
  • 人已阅读
简介提交存储过程之后要根据output参数来决定此次提交是否回滚!提交存储过程之后要根据output参数来决定此次提交是否回滚!提交存储过程之后要根据output参数来决定此次提交是否回滚!当前项目里的过程返回101一律回滚

  var cmd = FreeSql.Ado.CommandFluent(Input.ActionName).CommandType(CommandType.StoredProcedure).CommandTimeout(60).WithParameter($"IdentityUserId", CurrentUser.UserID);

            #region cmd参数处理

            if (Input.ParameterData != null)
            {
                var dic = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, object>>(Input.ParameterData.ToString());
                foreach (var item in dic)
                {
                    if (item.Value != null)
                    {
                        cmd.WithParameter(item.Key.Trim(), item.Value.ToString().Trim());
                    }
                }
            }

            //已改为上面的提交模式了
            //Input.ParameterData?.ForEach(item =>
            //{
            //    string[] Parameter = item.Split('=');
            //    cmd.WithParameter(Parameter[0], Parameter[1]);
            //});
            cmd.WithParameter("ResultStatus", null, p =>
            {
                p1 = p; //Output 参数
                p.DbType = DbType.Int32;
                p.Size = 10;
                p.Direction = ParameterDirection.Output;
            }).WithParameter("Msg", null, p =>
            {
                p2 = p; //Output 参数
                p.DbType = DbType.String;
                p.Size = int.MaxValue;
                p.Direction = ParameterDirection.Output;
            }).WithParameter("MsgExtend", null, p =>
            {
                p3 = p; //Output 参数
                p.DbType = DbType.String;
                p.Size = int.MaxValue;
                p.Direction = ParameterDirection.Output;
            });

            #endregion


            DataSet result = null;

            #region 事务用法A:适用于与其他框架共用一个事务,这里且不用
            //using Object<DbConnection> conn = FreeSql.Ado.MasterPool.Get();
            //using DbTransaction transaction = conn.Value.BeginTransaction();
            try
            {
                //result = await cmd.WithTransaction(transaction).ExecuteDataSetAsync();
                //...其他语句也WithTransaction(transaction)
                //返回101一律回滚
                //if ((int)p1.Value == 101)
                //{
                //    transaction.Rollback();
                //}
                //transaction.Commit();
            }
            catch (Exception ex)
            {
                //transaction.Rollback();//对没走try catch的过程报错进行手动回滚
            }
            #endregion

            //事务用法B:使用 UnitOfWork 事务,,注意:这3种用法都无法控制【存储过程】带try catch的事务回滚
            using (var uow = FreeSql.CreateUnitOfWork())
            {
                try
                {
                    result = await cmd.WithTransaction(uow.GetOrBeginTransaction()).ExecuteDataSetAsync();
                    //返回101一律回滚
                    if ((int)p1.Value == 101)
                    {
                        uow.Rollback();
                    }
                    uow.Commit();
                }
                catch (Exception ex)
                {
                    uow.Rollback();//对没走try catch的过程报错进行手动回滚
                    Log.Error("出错了" + ex.Message);
                }
            }

            #region 事务用法C:使用 UnitOfWorkManager 管理类事务:适合做跨方法事务
            //using (var uowManager = new UnitOfWorkManager(FreeSql))
            //{
            //    using (var uow = uowManager.Begin())
            //    {
            //        try
            //        {
            //            result = await cmd.WithTransaction(uow.GetOrBeginTransaction()).ExecuteDataSetAsync();
            //            //返回101一律回滚
            //            if ((int)p1.Value == 101)
            //            {
            //                uow.Rollback();
            //            }
            //            uow.Commit(); //事务提交
            //        }
            //        catch (Exception ex)
            //        {
            //            uow.Rollback();//对没走try catch的过程报错进行手动回滚
            //        }
            //    }
            //}
            #endregion

            #region 事务监控
            //FreeSql.Aop.CommandBefore += (s, e) =>
            //{
            //    //若下面有值表示事务正常提交
            //    var isCommited = e.Command.Transaction;
            //    var xd = isCommited != null;
            //    if (xd)
            //    {
            //        Console.WriteLine("事务成功开启");
            //    }
            //};
            //FreeSql.Aop.CommandAfter += (s, e) =>
            //{
            //    //若下面有值表示事务正常提交
            //    var isCommited = e.Command.Transaction;
            //    var xd = isCommited != null;
            //    if (xd)
            //    {
            //        Console.WriteLine("事务成功开启");
            //    }
            //};
            #endregion

 

上一篇:FreeSql仓储封装类

下一篇:BinGe个人博客

文章评论

评论
  • 消灭零回复
Top