2

当我在 Oracle 日期字段中插入 maxdate 时:

using (OracleCommand Cmd = new OracleCommand("insert into test (mydate) values (:mydate)", OracleConnection))
{
    Cmd.Parameters.Add(new OracleParameter(":mydate", DateTime.MaxValue));
    Cmd.ExecuteNonQuery();
}

并尝试检索值:

using (OracleCommand Cmd = new OracleCommand("select mydate from test where mydate=:mydate", OracleConnection))
{
    Cmd.Parameters.Add(new OracleParameter(":mydate", DateTime.MaxValue));
    object MyDate = Cmd.ExecuteScalar();
}

MyDate 对象保持为空。这意味着它不能读回记录。这是一个错误吗?某处舍入不匹配?

4

2 回答 2

1

那是因为Date数据库中的 不像DateTime.MaxValue.
它既不是相同的数据类型,也不是相同的精度。

试试这个查询:

OracleCommand Cmd = new OracleCommand("select dump(mydate), dump(:mydate) from test where rownum=1", OracleConnection)

结果将是这样的:

dump(mydate):  Typ=12 Len=7: 199,199,12,31,24,60,60
dump(:mydate): Typ=180 Len=11: 199,199,12,31,24,60,60,59,154,201,156

这意味着 DB 中的值是类型Date并且包含带秒但没有毫秒的时间,而参数被转换为包含timestamp毫秒的数据类型。

因此,如果您确实想在where clause尝试中使用它,请像这样:

using (OracleCommand Cmd = new OracleCommand("select mydate from test where trunc(mydate, 'mi') = trunc(:mydate, 'mi')", OracleConnection))
         {
             Cmd.Parameters.Add(new OracleParameter(":mydate", DateTime.MaxValue));
             object MyDate = Cmd.ExecuteScalar();
         } 

请注意,这也会截断秒数

于 2012-06-20T13:42:41.043 回答
1

如果您DateTime.MaxValue从 c# 传递给 oracle 假设timestamp参数,则该值将是:10000/01/01/ 00:00:00 Year:(10000是的,一万,这不是错字)。我相信这是 c# 和 oracle OLEDB 提供程序之间的错误

很可能您在插入时遇到异常并且插入失败。要确认年份值,请使用下一个表达式: EXTRACT (YEAR FROM CAST(yourparameter AS DATE))

祝你好运!

于 2013-03-19T20:34:11.453 回答