【问题标题】:Oracle Parameter not supported不支持 Oracle 参数
【发布时间】:2012-04-01 05:59:40
【问题描述】:

我收到了这个错误消息:

System.ArgumentException 未处理 不支持类型为 Devart.Data.Oracle.OracleParameter 的 Message=Value。

...使用此代码:

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

【问题讨论】:

    标签: c# oracle devart dotconnect


    【解决方案1】:

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

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

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

    【讨论】:

    • 这很有趣; devArt 中的猫(dotConnect 组件猫)不知道或注意到...
    • 好的,我在上面添加了以下信息。
    • 我在上面添加了另一个后续位;它基本上可以工作(检索数据),但它并不漂亮。
    • 只是猜测:您是否需要添加您想要返回的列作为附加参数?
    猜你喜欢
    • 2023-03-31
    • 2012-11-02
    • 1970-01-01
    • 1970-01-01
    • 2017-07-29
    • 2012-09-15
    • 2023-03-17
    • 1970-01-01
    • 2020-03-07
    相关资源
    最近更新 更多