1

使用以下 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

我认为这是导致问题的日期值。我在这里做错了什么?

4

3 回答 3

4

您应该使用 a DateTime,而不是 a string。这是首先使用参数化查询的要点之一。

oracleCommand1.Parameters.Add("iStartDate", new DateTime(2011, 1, 1));
oracleCommand1.Parameters.Add("iEndDate", new DateTime(2011, 1, 21));
于 2012-03-15T16:09:04.520 回答
0

作为对 Jon Skeet 回答的补充,如果您不使用参数化查询,Oracle 需要'YYYY-MM-DD'格式中的日期。

于 2012-03-15T16:11:20.597 回答
0

我意识到我参加聚会有点晚了,但另一个有趣的消息...

如果您从工具箱(作为组件)实例化您的 OracleCommand 并输入 CommandText(通过设计器),我发现它不会自然地将您的数据类型分配给参数。在它提供自动生成参数之后,如果你进去,我想你会看到它们都是 VarChar。

如果您将它们更改为 DateTime,则一切都应该正常工作,如上所述。如果你不这样做,它可能仍然可以工作,只要你提供正确的格式。不过,不要那样做。

于 2012-03-28T15:13:32.260 回答