2011-09-01 112 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的)。 –