ASP.NET Core MVC中依赖注入实现Oracle数据库连接的问题
ASP.NET Core MVC中依赖注入Oracle数据库连接并调用存储过程的正确实现
你的代码编译失败的核心原因是**OracleCommand.Connection需要OracleConnection类型,但你注入的是IDbConnection接口**,此外代码里还有若干语法和变量错误,以下是完整的修正方案:
1. 依赖注入部分(Program.cs)
你的注册代码是没问题的,IDbConnection是OracleConnection的接口,保留即可:
builder.Services.AddTransient<IDbConnection>((sp) => new OracleConnection(builder.Configuration.GetConnectionString("DBConn")));
2. HomeController修正代码
核心修改点:
- 将注入的
IDbConnection显式转换为OracleConnection供OracleCommand使用 - 修正未定义的变量(
conn→_connection、objCmd→cmd) - 移除手动调用的
Close()和Dispose(),using块会自动释放资源 - 声明未定义的
rowCNT变量 - 修正静态日志对象的不当赋值(建议通过依赖注入获取日志实例,而非静态赋值)
using Oracle.ManagedDataAccess.Client; using System.Data; using NLog; public class HomeController : Controller { private readonly ILogger<HomeController> _logger; private readonly IDbConnection _connection; private readonly Logger _nlogger; public HomeController(ILogger<HomeController> logger, Logger nlogger, IDbConnection connection) { _logger = logger; _nlogger = nlogger; _connection = connection; } public IActionResult Index() { int rowCNT = 0; try { using var oracleConn = (OracleConnection)_connection; oracleConn.Open(); using var cmd = new OracleCommand("pkgTest.TestSP", oracleConn); cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add("pi_app_cd", OracleDbType.Varchar2).Value = cID.APP_CODE; cmd.Parameters.Add("po_refcsr", OracleDbType.RefCursor).Direction = ParameterDirection.Output; using var reader = cmd.ExecuteReader(); while (reader.Read()) { rowCNT++; } ViewData["Title"] = "Home"; ViewData["RowCount"] = rowCNT; } catch (Exception ex) { _logger.LogError(ex, "调用存储过程时发生错误"); _nlogger.Error(ex, "NLog记录的存储过程调用错误"); } return View(); } }
额外注意事项
- 确保已通过NuGet安装
Oracle.ManagedDataAccess.Core包(ASP.NET Core环境需用这个包,而非旧的Oracle.ManagedDataAccess) - 避免使用静态日志实例,依赖注入的日志实例更符合ASP.NET Core的设计规范,也更易于测试
- 存储过程的参数名称、类型需与数据库端定义完全匹配,否则会引发执行错误
内容的提问来源于stack exchange,提问作者Ann
相关产品推荐
相关产品推荐

