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

时间:2015-01-08 14:30:27

标签: c# asp.net oracle

背景

我是一名几乎没有Oracle经验的.NET开发人员。客户端向我们提供了我们需要针对其网络上的数据库执行的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。到目前为止,我有以下(连接字符串混淆)...

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语句的一部分,但我对它所指的内容一无所知(它是等同于SQL模式还是什么?)。我很感激你的意见。

更新1

根据@MethodMan和@kevinsky的一些建议,我尝试添加额外的OracleDbType.RefCursor参数,现在我得到的错误是PLS-00306: wrong number or types of arguments in call to 'FNC_APPTS',这表明它毕竟击中了这个功能。因此,我假设原始的PLS-00221错误消息更多是对我的语法的抱怨,而不是找不到该函数。现在我真的陷入了困境,再次转向你,明智而仁慈的Stack Overflow社区,寻求指导......

更新2

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

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数据库。由于这个问题已经超出了我原来问题的范围,我有started a new thread并且如果一个人浮出水面,会将这个帖子链接到任何答案。

1 个答案:

答案 0 :(得分:0)

我在解决了我的问题的具体原因后,最终为这个问题开了一个新问题。这个问题和最终答案在这里:Error "fetch out of sequence" returning table from Oracle function in C# where function uses dblink to SQL Server