不支持的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。
没错! +1 – 2012-03-15 18:00:51
这很有趣; devArt的猫(dotConnect组件猫)不知道或注意到... – 2012-03-15 20:23:18
好的,我在上面添加了以下信息。 – 2012-03-15 20:37:08