2

这是我收到的错误消息

ORA-06550: line 1, column 15:
PLS-00306: wrong number or types of arguments in call to 'OBPL_SU_PLAN_UPDATE_PLAN_DTLS'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored

代码:

OracleCommand cmd = new OracleCommand();
cmd.Connection = conn;
cmd.CommandText = "CWPCDS.OBPL_SU_PROCESS_PKG.OBPL_SU_PLAN_UPDATE_PLAN_DTLS";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("P_PLAN_DETAIL_ID", OracleDbType.Int32).Value = detailId; 
cmd.Parameters.Add("P_PLAN_USER_DETAIL_ID", OracleDbType.Int32).Value = null; 
cmd.Parameters.Add("P_TRANSACTION_PLAN", OracleDbType.NVarchar2, 20).Value = null;
cmd.Parameters.Add("P_PLAN_REV_ID", OracleDbType.Int64).Value = planRev;                   
cmd.Parameters.Add("P_TRANSACTION_TYPE", OracleDbType.NVarchar2, 20).Value = transType;
cmd.Parameters.Add("P_PLAN_STATUS", OracleDbType.NVarchar2, 30).Value = status;  
cmd.Parameters.Add("P_DOC_ISSUE_DATE", OracleDbType.Date).Value = pid;
cmd.Parameters.Add("P_EST_OBLG_DATE", OracleDbType.Date).Value = eod;
cmd.Parameters.Add("P_AMT_TO_APPLY", OracleDbType.Int32).Value = amtApply;
cmd.Parameters.Add("P_WBS", OracleDbType.NVarchar2, 20).Value = wbs;
cmd.Parameters.Add("P_AMT1_TO_APPLY", OracleDbType.Int32).Value = 0;
cmd.Parameters.Add("P_AMT2_TO_APPLY", OracleDbType.Int32).Value = 0;
cmd.Parameters.Add("P_UPDATE_USER", OracleDbType.NVarchar2, 50).Value =
user;             
cmd.Parameters.Add("P_DESC_WORK", OracleDbType.NVarchar2, 50).Value = dow;
cmd.Parameters.Add("P_RET_CODE", OracleDbType.Int32).Direction =
ParameterDirection.Output;
cmd.Parameters.Add("P_RET_MSG", OracleDbType.Varchar2, 50).Direction =
ParameterDirection.ReturnValue;
cmd.ExecuteNonQuery();

我可以从 Toad 运行该程序而不会出现任何错误,Toad 中的日期格式是“05-MAY-2012”。如果我尝试在代码隐藏中的日期值中添加一个单独的 qoute,则会收到“字符文字中的字符过多”错误。非常感谢任何帮助或指导!

4

2 回答 2

3

我建议添加一个 DateTime .Net 值(变量),然后将参数分配给变量。这将为您处理转换。

DateTime dt = new DateTime(2012, 5, 7, 12, 23, 22, 0);
cmd.Parameters.Add(dt.ToString("dd-MMM-yyyy"), OracleDbType.Date).Value = dt;
于 2012-05-07T17:57:21.883 回答
1

您可以使用:

OracleCommandBuilder.DeriveParameters 方法

猜测每个参数所需的数据类型和名称。一旦你知道了,你就可以相应地修改你的方法。

有时您会收到错误,因为您决定使用的类型不是数据库所期望的类型(即对于 C# DateTime,可能有 TimeStamp、Date、SmallDate... 取决于 DB 类型。使用错误的参数类型可以导致错误或截断数据)。

切勿尝试将值作为字符串传递。将它们作为相应的 C# 类型传递。即传递日期,传递一个 DateTime 对象。该程序将注意将其转换为数据库可以理解的格式。如果您传递一个字符串,除非它是通用格式,否则如果您更改数据库配置,即默认语言,您可能会遇到麻烦。这就是为什么最好让系统处理转换细节的原因。它总是会以正确的方式进行。

于 2012-05-07T17:52:59.317 回答