迁移至VS2019后MVC C#调用Oracle存储过程遇参数错误
解决VS2019中EF调用Oracle存储过程出现ORA-06550/PLS-00306错误的方法
问题诊断
出现ORA-06550和PLS-00306错误的核心原因是参数不匹配,具体包括以下几点:
- 存储过程名称不一致:代码中调用的是
GETEMP,但实际数据库中的存储过程是CSR_GETEMP,导致EF无法定位到正确的存储过程。 - 参数数量缺失:存储过程定义了两个参数(输入
sEmpno、输出游标cCurRef),但当前代码仅传递了输入参数,缺少输出游标参数。 - 参数名称大小写不匹配: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.EntityFramework6.x版本 - 避免使用过旧或不兼容的驱动版本,防止参数解析逻辑出现差异
额外验证
修改完成后,可直接在代码中调试,或通过EF的函数导入测试功能验证参数传递是否正确,确保存储过程能正常返回数据。
内容的提问来源于stack exchange,提问作者BlackSD
相关产品推荐
相关产品推荐

