【问题标题】:What is the correct format to input a date parameter in an Oracle database from c#从 C# 在 Oracle 数据库中输入日期参数​​的正确格式是什么
【发布时间】:2012-05-16 04:28:38
【问题描述】:

这是我收到的错误消息

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,则会收到“字符文字中的字符过多”错误。非常感谢任何帮助或指导!

【问题讨论】:

  • 你可以看看my question 可能你对我的问题很熟悉。

标签: c# oracle stored-procedures ora-06550


【解决方案1】:

你可以使用:

OracleCommandBuilder.DeriveParameters Method

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

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

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

【讨论】:

  • 我不熟悉这个方法,我需要阅读这个,谢谢
【解决方案2】:

我建议添加一个 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;

【讨论】:

  • 在 Toad 中有效的格式是 '07-MAY-2011',但不是在代码参数值中。
  • 这和我给你的解决方案有什么关系? Toad 和 ADO.net 是两个不同的东西。你试过我上面给你的选项吗?
  • 感谢您的回复,是的,我确实尝试过,但没有成功,出现同样的错误。在 05/07/2012 00:00:00 以上生成的格式在此过程的 Toad 环境中也不成功。我只是指出了在 Toad 中成功运行此过程的格式。我的想法是,如果我可以在 .net 端重现该格式,它应该可以工作。
  • 不指定数据类型试一试。我编辑了我的答案以显示。
  • 我收到一个错误,因为 "cmd.Parameters.Add("P_DOC_ISSUE_DATE").Value" 默认为 int 类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-01
相关资源
最近更新 更多