繁体   English   中英

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

[英]Read data table from Oracle DB function in ASP.NET

背景

我是.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;

我一直在试图了解如何使用Oracle.ManagedDataAccess assemly在ASP.NET中使用它来填充一个DataTable 到目前为止,我有以下内容(混淆了连接字符串)...

string connstring = "Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=1.1.1.1)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=****)));User Id=****;Password=****;";

using (var connection = new OracleConnection(connstring))
{
    connection.Open();
    using (var command = new OracleCommand())
    {
        command.Connection = connection;
        command.CommandText = "FNC_APPTS";
        command.CommandType = CommandType.StoredProcedure;

        command.Parameters.Add(new OracleParameter("PIN_GMC", OracleDbType.Varchar2, 50)).Value = consultantCode;
        command.Parameters.Add(new OracleParameter("PIN_LOCATION", OracleDbType.Varchar2, 50)).Value = location;
        command.Parameters.Add(new OracleParameter("PIN_DISTANCE", OracleDbType.Int32)).Value = distance;
        command.Parameters.Add(new OracleParameter("PIN_PERIOD", OracleDbType.Int32)).Value = period;
        command.Parameters.Add(new OracleParameter("PIN_SORT", OracleDbType.Varchar2, 50)).Value = sort;

        using (var reader = command.ExecuteReader())
        {
            dt.Load(reader);
        }
    }
}

...但是这给了我错误PLS-00221: 'FNC_APPTS' is not a procedure or is undefined

我怀疑这与SQL语句的“ from dual”部分有关,但是我对它所指的含义不了解(它等同于SQL模式还是其他?)。 非常感谢您的建议。

更新1

从@MethodMan和@kevinsky得到一些建议后,我尝试添加一个额外的OracleDbType.RefCursor参数,现在我得到的错误是PLS-00306: wrong number or types of arguments in call to 'FNC_APPTS' ,这表明它正在命中毕竟功能。 因此,我认为原始的PLS-00221错误消息更多是关于我的语法的抱怨,而不是找不到该函数。 现在,我真的很困惑,再次向您寻求帮助,明智而又仁慈的Stack Overflow社区,以获取指导...

更新2

经过更多阅读后,我现在发现,如果添加这样的return参数...

OracleParameter retVal = new OracleParameter("retVal", OracleDbType.RefCursor);
retVal.Direction = ParameterDirection.ReturnValue;
command.Parameters.Add(retVal);

...然后执行command.ExecuteNonQuery(); 我发现retVal.Value的类型为OracleRefCursor 但是,如果我那么...

using (OracleDataReader reader = ((Oracle.ManagedDataAccess.Types.OracleRefCursor)retVal.Value).GetDataReader())
{
    dt.Load(reader);
}

...我收到错误ORA-01002: fetch out of sequence 感觉我在这里越来越近。 这有帮助吗?

更新3

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

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

我现在可以访问该函数主体,并相信GATE_LINK是一个SQL Server数据库。 由于此问题已超出我最初的问题范围,因此我启动了一个新线程 ,并将该线程链接到那里的任何答案(如果有的话)。

在确定问题的具体原因之后,我最终为此问题提出了一个新问题。 该问题和最终答案在这里: 错误“从序列中提取错误”从C#中的Oracle函数返回表,其中函数使用dblink到SQL Server

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM