.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); } }
关键修改点说明
- 替换调用语法:将
exec pLouerCopieFilm :p1, :p2改为BEGIN pLouerCopieFilm(:p1, :p2); END;,这是Oracle调用无返回值存储过程的标准PL/SQL写法。 - 资源自动释放:用
using语句包裹session,确保数据库连接自动释放,避免资源泄漏。 - 事务处理:新增事务管理,确保存储过程执行的修改操作具备原子性,出错时回滚数据,避免脏数据。
- 规范响应:用
Ok()替代StatusCode(200),符合ASP.NET Core的响应规范。
额外检查项
- 确认NHibernate配置的Oracle驱动正确(推荐使用
Oracle.ManagedDataAccess.Client)。 - 验证存储过程的参数类型与传入的
locationRequest.IdClient、locationRequest.IdFilm类型完全匹配(比如都是数字类型)。 - 确保当前连接数据库的用户拥有
EXECUTE权限执行pLouerCopieFilm存储过程。
内容的提问来源于stack exchange,提问作者Luis Angel Urena Lopez
相关产品推荐
相关产品推荐

