C# 从ASP.NET中的Oracle DB函数读取数据表

C# 从ASP.NET中的Oracle DB函数读取数据表,c#,asp.net,oracle,C#,Asp.net,Oracle,背景 我是一名.NET开发人员,几乎没有Oracle经验。一位客户向我们提供了需要针对其网络上的数据库执行的Oracle函数的详细信息。它返回一个数据表。我需要在ASP.NET中使用它 问题 我们有一个可以连接的服务器。在该服务器上,我安装了SQL Plus,并成功地使用它执行以下SQL,因此我知道连接和功能本身都是可靠的: SELECT FNC_APPTS(PIN_GMC =>'C2331780', PIN_LOCATION =>'RG26 5SW', PIN_DISTANCE =

背景

我是一名.NET开发人员,几乎没有Oracle经验。一位客户向我们提供了需要针对其网络上的数据库执行的Oracle函数的详细信息。它返回一个数据表。我需要在ASP.NET中使用它

问题

我们有一个可以连接的服务器。在该服务器上,我安装了SQL Plus,并成功地使用它执行以下SQL,因此我知道连接和功能本身都是可靠的:

SELECT FNC_APPTS(PIN_GMC =>'C2331780', PIN_LOCATION =>'RG26 5SW', PIN_DISTANCE => 1000, PIN_PERIOD => 7, PIN_SORT =>'DATE' ) from dual;
我一直在试图了解如何使用ASP.NET中的
Oracle.ManagedDataAccess
组件来填充
DataTable
。到目前为止,我有以下内容(连接字符串混淆)

…但这给了我一个错误
PLS-00221:“FNC_APPTS”不是一个过程或是未定义的

我怀疑这与SQL语句的“from dual”部分有关,但我不清楚它指的是什么(它是否等同于SQL模式或其他东西?)。谢谢你的建议

更新1

在得到@MethodMan和@kevinsky的一些建议后,我尝试添加一个额外的
OracleDbType.RefCursor
参数,现在我得到的错误是
PLS-00306:调用'FNC_APPTS'
时参数的数量或类型错误,这表明它毕竟在命中函数。因此,我假设原始的
PLS-00221
错误消息更多的是对我的语法的抱怨,而不是找不到函数。现在我真的被困住了,再次向你们求助,哦,智慧和仁慈的堆栈溢出社区,寻求指导

更新2

经过更多的阅读,我现在发现如果我添加一个返回参数,像这样

OracleParameter retVal = new OracleParameter("retVal", OracleDbType.RefCursor);
retVal.Direction = ParameterDirection.ReturnValue;
command.Parameters.Add(retVal);
…然后
command.ExecuteOnQuery()
我发现
retVal.Value
属于
OracleRefCursor
类型。然而,如果我当时

using (OracleDataReader reader = ((Oracle.ManagedDataAccess.Types.OracleRefCursor)retVal.Value).GetDataReader())
{
    dt.Load(reader);
}
。。。我得到错误信息
ORA-01002:提取顺序错误
。感觉我离这里越来越近了。这有帮助吗

更新3

我相信我越来越近了。完全错误是:

ORA-01002: fetch out of sequence
ORA-02063: preceding line from GATE_LINK

我现在可以访问函数体,并且相信GATE_LINK是一个SQL Server数据库。因为这个问题已经超出了我原来问题的范围,我已经并将把这个线程链接到这里的任何答案上,如果有人出现的话。

我最终为这个问题打开了一个新的问题,在关注我问题的具体原因之后。这个问题和最终答案在这里:

在Oracle中,您的存储过程是在
包中还是存储过程节点中。。?尝试完全限定数据库用户的名称,例如,我的Oracle数据库中有一个存储过程,位于名为
Humana
OtherUsers
节点内,因此我会在命令文本
Humana.FNC_APPTS
中简化此操作,您也可以将该连接字符串剪切为类似于此的内容您的web.config。。它之所以有效是因为我尝试过类似于您的方法,而且使用起来很麻烦。请参见此处更改您的连接字符串并在web.config文件中进行设置,类似这样的
@MethodMan谢谢,当然,一旦成功,我将配置连接字符串。我只是在这里测试。但是,您的连接字符串看起来像SQL Server字符串?至于存储过程的细节,我知之甚少。我假设,因为我有一个SQL字符串,我可以在SQL Plus中成功执行它,然后我就有了在C#中执行和处理返回表所需的一切。如果函数调用需要显式用户名,那么SQL Plus中的SQL肯定也会失败?@Avijit谢谢,但是你能解释一下这个链接有什么帮助吗?
ORA-01002: fetch out of sequence
ORA-02063: preceding line from GATE_LINK