You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core中用NHibernate调用Oracle无返回值存储过程失败求助

问题原因与解决方案

你的代码无法运行的核心原因是用了SQL Server的存储过程调用语法exec,但Oracle需要使用PL/SQL块格式来调用无返回值存储过程。

修正后的代码

[HttpPost("louerFilm")]
[Authorize]
public IActionResult LouerFilm(LocationRequest locationRequest)
{
    using var session = _nHibernateHelper.OpenSession();
    using var transaction = session.BeginTransaction();

    try
    {
        // 用Oracle的PL/SQL块语法调用存储过程
        session.CreateSQLQuery("BEGIN pLouerCopieFilm(:p1, :p2); END;")
            .SetParameter("p1", locationRequest.IdClient)
            .SetParameter("p2", locationRequest.IdFilm)
            .ExecuteUpdate();

        transaction.Commit();
        return Ok();
    }
    catch (Exception e)
    {
        transaction.Rollback();
        Console.WriteLine(e);
        return StatusCode(471);
    }
}

关键修改点说明

  1. 替换调用语法:将exec pLouerCopieFilm :p1, :p2改为BEGIN pLouerCopieFilm(:p1, :p2); END;,这是Oracle调用无返回值存储过程的标准PL/SQL写法。
  2. 资源自动释放:用using语句包裹session,确保数据库连接自动释放,避免资源泄漏。
  3. 事务处理:新增事务管理,确保存储过程执行的修改操作具备原子性,出错时回滚数据,避免脏数据。
  4. 规范响应:用Ok()替代StatusCode(200),符合ASP.NET Core的响应规范。

额外检查项

  • 确认NHibernate配置的Oracle驱动正确(推荐使用Oracle.ManagedDataAccess.Client)。
  • 验证存储过程的参数类型与传入的locationRequest.IdClient、locationRequest.IdFilm类型完全匹配(比如都是数字类型)。
  • 确保当前连接数据库的用户拥有EXECUTE权限执行pLouerCopieFilm存储过程。

内容的提问来源于stack exchange,提问作者Luis Angel Urena Lopez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 14:12:53