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

迁移至VS2019后MVC C#调用Oracle存储过程遇参数错误

解决VS2019中EF调用Oracle存储过程出现ORA-06550/PLS-00306错误的方法

问题诊断

出现ORA-06550和PLS-00306错误的核心原因是参数不匹配,具体包括以下几点:

  1. 存储过程名称不一致:代码中调用的是GETEMP,但实际数据库中的存储过程是CSR_GETEMP,导致EF无法定位到正确的存储过程。
  2. 参数数量缺失:存储过程定义了两个参数(输入sEmpno、输出游标cCurRef),但当前代码仅传递了输入参数,缺少输出游标参数。
  3. 参数名称大小写不匹配:Oracle默认会将未加引号的标识符转为大写,代码中使用的SEMPNO与存储过程定义的sEmpno可能因大小写问题导致参数映射失败。

具体解决步骤

1. 修正DbContext中的存储过程调用方法

修改方法名称为与数据库存储过程一致的CSR_GETEMP,并补充输出游标参数:

public virtual ObjectResult<Employee> CSR_GETEMP(string sEMPNO)
{
    // 输入参数:使用大写参数名,兼容Oracle默认标识符规则
    var sEMPNOParameter = sEMPNO != null ?
        new ObjectParameter("SEMPNO", sEMPNO) :
        new ObjectParameter("SEMPNO", typeof(string));
    
    // 输出游标参数:对应存储过程的out参数CCURREF
    var cCurRefParameter = new ObjectParameter("CCURREF", typeof(System.Data.Entity.Core.Objects.ObjectResult<Employee>));

    // 调用正确的存储过程名称,传入所有参数
    return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<Employee>("CSR_GETEMP", sEMPNOParameter, cCurRefParameter);
}

2. 修正控制器中的调用代码

将控制器中调用的方法名改为修正后的CSR_GETEMP:

public JsonResult GetUserInfo(string sEmpno)
{
    var modeldata = db.CSR_GETEMP(sEmpno);
    
    return new JsonResult { Data = modeldata, JsonRequestBehavior = JsonRequestBehavior.AllowGet };
}

3. 验证EDMX模型的函数导入配置

打开EDMX文件的模型浏览器,检查对应存储过程的函数导入:

  • 函数导入名称必须为CSR_GETEMP
  • 参数配置:SEMPNO为输入参数,CCURREF为输出参数
  • 返回类型绑定到已创建的Employee复杂类型

4. 确保Oracle驱动与EF版本兼容

VS2019中使用的EF版本(如EF6)需要匹配对应的Oracle数据访问驱动版本:

  • 若使用EF6,需安装Oracle.ManagedDataAccess.EntityFramework 6.x版本
  • 避免使用过旧或不兼容的驱动版本,防止参数解析逻辑出现差异

额外验证

修改完成后,可直接在代码中调试,或通过EF的函数导入测试功能验证参数传递是否正确,确保存储过程能正常返回数据。

内容的提问来源于stack exchange,提问作者BlackSD

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 12:57:04