2012-03-15 87 views
0

我得到這個錯誤消息:不支持的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())我想要的各個列並以編程方式將它們添加到備忘錄或某些類似...

回答

3

看起來像我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