背景
我是一名几乎没有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并且如果一个人浮出水面,会将这个帖子链接到任何答案。
答案 0 :(得分:0)
我在解决了我的问题的具体原因后,最终为这个问题开了一个新问题。这个问题和最终答案在这里:Error "fetch out of sequence" returning table from Oracle function in C# where function uses dblink to SQL Server