不支持的Oracle参数

问题描述:

我得到这个错误消息:不支持的Oracle参数

System.ArgumentException了未处理 不支持消息=型Devart.Data.Oracle.OracleParameter值。

...与此代码:

OracleParameter pRes = new OracleParameter("C_REF", OracleDbType.Cursor); 
    pRes.Direction = ParameterDirection.ReturnValue; 

    oracleCommand1.Parameters.Clear(); 
    int iFromYear = dateTimePickerFrom.Value.Year; 
    int iFromMonth = dateTimePickerFrom.Value.Month; 
    int iFromDay = dateTimePickerFrom.Value.Day; 
    int iToYear = dateTimePickerTo.Value.Year; 
    int iToMonth = dateTimePickerTo.Value.Month; 
    int iToDay = dateTimePickerTo.Value.Day; 
    oracleCommand1.Parameters.Add("iStartDate", new DateTime(iFromYear, iFromMonth, iFromDay)); 
    oracleCommand1.Parameters.Add("iEndDate", new DateTime(iToYear, iToMonth, iToDay)); 
    oracleCommand1.Parameters.Add("iCATEGORYID", 114); 
    oracleCommand1.Parameters.Add("c_ref", pRes); 
    oracleConnection1.Open(); 
    oracleCommand1.ExecuteCursor(); 

更新响应评论:

那么什么可以替代的OracleParameter的用于传递?

当我将其更改为这个(我只是挥舞周围像一个忙碌的鸡):

oracleConnection1.Open(); 
    OracleDataReader myReader = oracleCommand1.ExecuteReader(); 
    OracleParameter pRes = new OracleParameter("C_REF", myReader); 
    pRes.Direction = ParameterDirection.InputOutput; // <-- devArt's code 

    oracleCommand1.Parameters.Clear(); 
    int iFromYear = dateTimePickerFrom.Value.Year; 
    int iFromMonth = dateTimePickerFrom.Value.Month; 
    int iFromDay = dateTimePickerFrom.Value.Day; 
    int iToYear = dateTimePickerTo.Value.Year; 
    int iToMonth = dateTimePickerTo.Value.Month; 
    int iToDay = dateTimePickerTo.Value.Day; 
    oracleCommand1.Parameters.Add("iStartDate", new DateTime(iFromYear, iFromMonth, iFromDay)); 
    oracleCommand1.Parameters.Add("iEndDate", new DateTime(iToYear, iToMonth, iToDay)); 
    oracleCommand1.Parameters.Add("iCATEGORYID", 114); 
    oracleCommand1.Parameters.Add("c_ref", pRes); 
    while (myReader.Read()) 
    { 
     ;// Console.WriteLine(myReader.GetInt32(0) + ", " + myReader.GetString(myReader.GetOrdinal("DName"))); 
    } 
    // always call Close when done reading. 
    myReader.Close(); 

...我得到也不犯错封邮件,但我也拿不出数据。

更新到最新版本:

好的,我终于搞定了。这些可能不是优雅,但它确实retreive数据:

oracleCommand1.Parameters.Clear(); 
    int iFromYear = dateTimePickerFrom.Value.Year; 
    int iFromMonth = dateTimePickerFrom.Value.Month; 
    int iFromDay = dateTimePickerFrom.Value.Day; 
    int iToYear = dateTimePickerTo.Value.Year; 
    int iToMonth = dateTimePickerTo.Value.Month; 
    int iToDay = dateTimePickerTo.Value.Day; 
    oracleCommand1.Parameters.Add("iStartDate", new DateTime(iFromYear, iFromMonth, iFromDay)); 
    oracleCommand1.Parameters.Add("iEndDate", new DateTime(iToYear, iToMonth, iToDay)); 
    oracleCommand1.Parameters.Add("iCATEGORYID", 114); 

    oracleConnection1.Open(); 
    OracleDataReader myReader = oracleCommand1.ExecuteReader(); 
    OracleParameter pRes = new OracleParameter("C_REF", myReader); 
    pRes.Direction = ParameterDirection.InputOutput; 

    oracleCommand1.Parameters.Add("c_ref", pRes); 

    while (myReader.Read()) 
    { 
     MessageBox.Show(myReader.GetString(0)); // + ", " + myReader.GetString(myReader.GetOrdinal("contactemail"))); 
    } 
    myReader.Close(); 

现在,虽然我如何可以检索的所有数据,而不是仅仅从一个列,如我上面做什么?最好的情况是直接将结果集导入DataGridView,但如果必须我可以concat(stringFormat())我想要的各个列并以编程方式将它们添加到备忘录或某些类似...

看起来像我this page说OracleDBType.Cursor类型不能用在这里:

Oracle REF CURSOR。此类型没有相应的.NET Framework类型。 OracleDataReader对象可用于检索游标内容。

除非,当然我误解了文档,这是完全可能的,因为我不做C#/ DevArt。

+0

没错! +1 – 2012-03-15 18:00:51

+0

这很有趣; devArt的猫(dotConnect组件猫)不知道或注意到... – 2012-03-15 20:23:18

+0

好的,我在上面添加了以下信息。 – 2012-03-15 20:37:08