关于FreeSQL事务提交存储过程遇到的问题
- FreeSql
- 2023/11/30 10:14:00
- 人已阅读
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个人博客
文章评论
- 消灭零回复