2011-09-01 104 views
3

我正在尝试使用ODP.NET将.NET DateTime值插入到Oracle DATE列中。将.NET DateTime转换为OracleDate

new OracleDate(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, DateTimeNow.Hour, DateTime.Now.Minute, DateTime.Now.Second) 

当我尝试这一点,它插入正确的年,月,日入列,但时间是:到目前为止,我已经使用OracleDate()构造函数来投的.NET日期时间,像这样试过始终设置为午夜。我如何在日期中插入正确的时间?

不带参数的SQL看起来像这样(DateTime.Now用于清晰度,否则我只是用SYSDATE):

"update mytable set timestamp = '" + new OracleTimeStamp(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, DateTime.Now.Hour, DateTime.Now.Minute, DateTimeNow.Second) + "'" 

回答

4

根据this你应该使用OracleTimeStampOracleDbType实现你想要...

OracleDate没有时间部分......这种行为在JDBC驱动程序的某个时间开始(IIRC Oracle 8左右)...... JDBC驱动程序存在/是一些奇怪的解决方法,现在不要记住它......我不知道是否有O的解决方法DP.NET ... OracleTimeStamp是与时间部分日期的正式支持方式......

编辑 - 后OP添加SQL语句:

所有这句话的第一个包含两个问题 - 永不名一个列/表像一个保留字(即timestamp)......另一个问题是缺少使用参数,在这种情况下,这个参数不会导致SQL注入,但仍然是不好的做法并且导致(如果多次使用相同的语句)导致性能损失最小。 ..

如果你仍然想使用它的方式,那么这将工作:

"update mytable set timestamp = TO_DATE ('" + DateTime.Now.ToString ("yyyyMMddHHmmss") + "', 'YYYYMMDDHH24MISS')"; 
+1

使用OracleTimeStamp类型会导致Oracle错误:“日期格式图片在转换整个输入字符串之前结束。” – kittyhawk

+0

请显示确切的SQL语句 - 也许它需要一个最小的修改 – Yahia

+0

请参阅我的编辑上面... – Yahia

4

您应该使用此参数。当一个等效的.NET数据类型可以使用时,也不需要使用特定于Oracle的数据类型。由于大多数其他驱动程序都使用本机.NET数据类型,因此它可以在以后轻松地将ODP.NET替换为其他驱动程序。

using (OracleConnection conn = new OracleConnection("your connection string here") 
{ 
    string query = "update mytable set timestamp = :foo"; 

    using (OracleCommand cmd = new OracleCommand(query, conn)) 
    { 
     cmd.Parameters.Add(":foo", DateTime.Now); 

     cmd.ExecuteNonQuery(); 
    } 
} 
+0

我同意。没有理由使用时间戳。 – tsells

+0

我有类似的问题。我应该只是输入日期?现在,我输入一个字符串,并结束时间。 – SoftwareSavant

+0

@DmainEvent:是的,假设上面的“mytable.timestamp”列有适当的数据类型(例如Oracle中的DATE或TIMESTAMP中的DATE),那么我使用的所有ADO.NET驱动程序和数据库都可以与上面的代码一起使用。 Postgres的)。 –