使用以下C#代码(使用devArt的dotConnect for Oracle组件):
OracleParameter pRes = new OracleParameter("C_REF", OracleDbType.Cursor);
pRes.Direction = ParameterDirection.ReturnValue;
oracleCommand1.Parameters.Clear();
oracleCommand1.Parameters.Add("iStartDate", "01-jan-2011");
oracleCommand1.Parameters.Add("iEndDate", "21-jan-2011");
oracleCommand1.Parameters.Add("iCATEGORYID", 114);
oracleCommand1.Parameters.Add(pRes);
oracleConnection1.Open();
oracleCommand1.ExecuteCursor();
......我得到了:
Devart.Data.Oracle.OracleException未处理 消息= ORA-06550:第2行第13列: PLS-00306:调用'CONN_THRU_DOTNET'时参数的数量或类型错误 ORA-06550
参数是(从存储过程中复制):
iStartDate IN DATE
, iEndDate IN DATE
, iCATEGORYID IN NUMBER
, C_REF IN OUT SYS_REFCURSOR
我认为这是导致问题的日期值。我在这里做错了什么?
答案 0 :(得分:4)
您应该使用DateTime
,而不是string
。这是首先使用参数化查询的要点之一。
oracleCommand1.Parameters.Add("iStartDate", new DateTime(2011, 1, 1));
oracleCommand1.Parameters.Add("iEndDate", new DateTime(2011, 1, 21));
答案 1 :(得分:0)
作为对Jon Skeet的回答的补充,如果您不使用参数化查询,Oracle会期望采用'YYYY-MM-DD'
格式的日期。
答案 2 :(得分:0)
我意识到我对派对来说有点晚了,但另一个感兴趣的是......
如果您从工具箱(作为组件)实例化OracleCommand并输入CommandText(通过设计器),我发现它不会自然地将您的数据类型分配给参数。在它提供自动生成参数后,如果你进去,我想你会发现它们都是VarChar。
如果将它们更改为DateTime,一切都应该完美,如上所述。如果不这样做,只要您提供正确的格式,它可能仍然有效。不过,不要这样做。