0

我收到了这个错误消息:

System.ArgumentException 未处理 Message=Value 类型不支持 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();

...我也没有收到错误消息,但我也没有收到任何数据。

更新到更新:

好的,我终于让它工作了。这些可能不优雅,但它确实检索数据:

    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,但如果必须,我可以连接 (stringFormat()) 我想要的各种列,并以编程方式将它们添加到备忘录或类似的...

4

1 回答 1

3

在我看来这个页面说 OracleDBType.Cursor 类型不能在这里使用:

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

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

于 2012-03-15T17:44:54.253 回答