【发布时间】:2015-07-03 02:52:34
【问题描述】:
我正在 oracle 中设置一个存储过程。它接受许多参数。其中有几个是“日期”类型的。
在我的应用程序中,我检查一个值,如果它符合这样的特定条件,则分配默认值:
private static string FixInputString(string s)
{
return string.IsNullOrEmpty(s) ? "-1" : s;
}
然后,我将其格式化为 Oracle 的日期
private static string ConvertToOracleDate(string s)
{
var temp = string.IsNullOrEmpty(s) || string.Equals(s, "-1", StringComparison.InvariantCultureIgnoreCase)
? "01-Jan-1900" : Convert.ToDateTime(s).ToString("dd-MMM-yyyy");
return temp;
}
当我运行它时,我在变量中有这个值:
然后我设置参数如下:
new SpParameterOracle
{
Key = "p_SGND_DT",
Value = ConvertToOracleDate(FixInputString(form.SignedOnDate)),
Direction = ParameterDirection.Input,
Type = OracleDbType.Date
},
这是我将参数分配给 OracleCommand 时的参数内容:
我的存储过程,这样处理输入参数:
decode(TO_CHAR(p_SGND_DT, 'mm/dd/yyyy'), '01/01/1900', null, TO_DATE(p_SGND_DT, 'DD-MON-YYYY')),
我也试过这个:
decode(TO_CHAR(p_SGND_DT, 'mm/dd/yyyy'), '01/01/1900', null, p_SGND_DT),
表格中的结果值是这样的:
为什么它从 1901 年 1 月 1 日更改为 2001 年 1 月 1 日???
到目前为止,我已经尝试在应用程序和存储过程中切换格式,结果还是一样。
任何想法都将不胜感激。
正如其中一个答案所建议的那样,转换是这个问题的罪魁祸首。
我没有处理它,而是修改了存储过程的逻辑以及代码。 在存储过程中,我将所有必要的字段设为可选,如下所示:
p_SGND_DT in date default null,
然后我只需在表中插入一个值。 在应用程序方面,我修改了代码以仅发送使用的参数并省略其余为空的参数。
感谢您的帮助并为我指明了正确的方向。非常感谢。
【问题讨论】:
-
你是不是刚刚尝试从 sqlplus 调用存储的 proc 并查看结果是什么?
-
不,但我现在就去做...
-
对格式不满意:'dd-MON-yyyy'。更改为“dd/MM/yyyy”。结果相同:'1/1/2001'。