在工作和学习中有时候会在代码里直接调用执行sql的存储过程。现在是后端ABP框架+MySQL的存储过程。
1.首先在MySQL实现存储过程业务功能,这里是存储过程头,具体业务看实际需求
CREATE DEFINER=`root`@`%` PROCEDURE `prc_notice_stock`(
IN v_MES_billID varchar(50),
OUT v_isSucc TINYINT,
OUT v_errinfo VARCHAR(2000)
)
2.当前服务先注入db上下文
private readonly HelloAbpMigrationsDbContext _dbContext; // 注入 DbContext
3.具体接口方法实现,有代码注释
public async Task<ResultDto> NotifyProductReceipt(Guid id)
{
try
{
_logger.LogInformation($"调用缴库存储过程:{id}");
// 创建数据库连接
var connection = _dbContext.Database.GetDbConnection();
await connection.OpenAsync();
// 创建命令对象
using (var command = connection.CreateCommand())
{
// 设置命令类型为存储过程
command.CommandType = System.Data.CommandType.StoredProcedure;
command.CommandText = "prc_notice_stock";
// 输入参数
command.Parameters.Add(new MySqlParameter("@v_MES_billID", MySqlDbType.VarChar) { Value = id });
// 定义输出参数
var vIsSuccParam = new MySqlParameter("@v_isSucc", MySqlDbType.Byte) { Direction = System.Data.ParameterDirection.Output };
var vErrInfoParam = new MySqlParameter("@v_errinfo", MySqlDbType.VarString, 2000) { Direction = System.Data.ParameterDirection.Output };
command.Parameters.Add(vIsSuccParam);
command.Parameters.Add(vErrInfoParam);
// 执行存储过程
await command.ExecuteNonQueryAsync();
// 获取输出参数的值
// 获取输出参数的值
sbyte isSuccessSByte = (sbyte)vIsSuccParam.Value; // 获取 SByte 类型的值
var isSuccessStr = isSuccessSByte.ToString();
var isSuccess = int.Parse(isSuccessStr);
var infor = vErrInfoParam.Value.ToString();
if (isSuccess == 1)
{
return new ResultDto<int>(true, "成功", isSuccess);
}
else
{
return new ResultDto<int>(false, infor, isSuccess);
}
}
}
catch (Exception ex)
{
_logger.LogError($"调用缴库存储过程异常:{ex}");
throw;
}
}


被折叠的 条评论
为什么被折叠?



