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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 23:39:53