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();

...エラー メッセージも表示されませんが、データも取得されません。

アップデートへのアップデート:

OK、ようやく機能しました。これらはエレガントではないかもしれませんが、データを取得します:

    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();

ただし、上記のように 1 つの列からではなく、すべてのデータを取得するにはどうすればよいでしょうか。最良のシナリオは、結果セットを DataGridView に送信することですが、必要な場合は、必要なさまざまな列を連結 (stringFormat()) し、プログラムでメモなどに追加することができます...

4

1 に答える 1

3

このページには、OracleDBType.Cursor タイプはここでは使用できないと書かれているように見えます。

Oracle REF CURSOR。この型には、対応する .NET Framework 型がありません。OracleDataReader オブジェクトを使用して、カーソルのコンテンツを取得できます。

もちろん、ドキュメントを誤解している場合を除きます。これは、C#/DevArt を行っていないことを考えると完全に可能です。

于 2012-03-15T17:44:54.253 に答える