如果问题重复,请原谅。我的解决方案中有两个项目,一个控制台应用程序和一个MVC4网站。我使用Oracle托管drviers访问oracle数据库11g。我试图从以下存储过程中检索数据:
create or replace procedure "GETEMPIDS"
(
p_cursor OUT SYS_REFCURSOR
)
is
begin
OPEN p_cursor FOR
select *
from EMP;
end;
在我的控制台应用程序中创建实体和其他内容后,我通过执行以下操作获取数据:
public List<GETEMPIDS_Result> GetAllEmployees()
{
Entities db = new Entities();
List<GETEMPIDS_Result> result = db.GETEMPIDS().ToList<GETEMPIDS_Result>();
return result;
}
我在我的网站上添加了这个控制台应用程序的引用,但是当我在我的控制器中调用上面的方法时,它给出了异常:
"ORA-06550: line 1, column 8:\nPLS-00306: wrong number or types of arguments in call to 'GETEMPIDS'\nORA-06550: line 1, column 8:\nPL/SQL: Statement ignored"}
在上下文类的后续行
public virtual System.Data.Entity.Core.Objects.ObjectResult<GETEMPIDS_Result> GETEMPIDS()
{
return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<GETEMPIDS_Result>("GETEMPIDS");
}
我有什么遗失的吗?
答案 0 :(得分:2)
当我们在实体中添加存储过程的结果时,它会在配置文件中添加一些与输出字段相关的代码。
<implicitRefCursor>
<storedProcedure schema="AHSEN" name="GETEMPIDS">
<refCursor name="P_CURSOR">
<bindInfo mode="Output" />
<metadata columnOrdinal="0" columnName="EMPNO" providerType="Int16" allowDBNull="false" nativeDataType="Number" />
<metadata columnOrdinal="1" columnName="ENAME" providerType="Varchar2" allowDBNull="true" nativeDataType="Varchar2" />
<metadata columnOrdinal="2" columnName="JOB" providerType="Varchar2" allowDBNull="true" nativeDataType="Varchar2" />
<metadata columnOrdinal="3" columnName="MGR" providerType="Int16" allowDBNull="true" nativeDataType="Number" />
<metadata columnOrdinal="4" columnName="HIREDATE" providerType="Date" allowDBNull="true" nativeDataType="Date" />
<metadata columnOrdinal="5" columnName="SAL" providerType="Single" allowDBNull="true" nativeDataType="Number" />
<metadata columnOrdinal="6" columnName="COMM" providerType="Single" allowDBNull="true" nativeDataType="Number" />
<metadata columnOrdinal="7" columnName="DEPTNO" providerType="Int16" allowDBNull="true" nativeDataType="Number" />
</refCursor>
</storedProcedure>
</implicitRefCursor>
当我复制该代码并将其粘贴到我网站的配置文件中时,我的问题就解决了。
答案 1 :(得分:0)
您的程序GETEMPIDS
接受p_cursor OUT SYS_REFCURSOR
作为参数。显然,您必须声明ResultSet并将其传递给过程。像这样:
ResultSet rs = new ResultSet;
List<GETEMPIDS_Result> result = db.GETEMPIDS( rs ).ToList<GETEMPIDS_Result>();
糟糕,ResultSet适用于Java,我没有注意到标签中的C#。 无论如何,我希望你能得到这个想法。