2013-02-26 106 views
0

我想在Oracle中的日期字段中插入日期時間。到目前爲止我已經使用了sysdate,它完美的工作,但是我需要使用相同的時間戳。將日期插入到Oracle中

有誰知道我如何創建一個與oracle的日期字段兼容的日期時間變量?我嘗試的一切都會導致錯誤

我試圖沿着這一行的變化:

Dim timestamp As DateTime = CDate(Now.ToString("yyyy/MM/dd HH:mm:ss")) 

.......more code.... 

insertBuilder.Append("date = to_date(" & timestamp & ")") 
+0

爲什麼拿一個日期,轉換爲字符串,然後_back_日期?這只是不必要的工作。如果你使用參數化查詢,你將不必經歷這個麻煩! – 2013-02-26 16:52:30

+0

我明白你的意思。上面的代碼是糟糕的,但是對VB來說是新的,我還不知道更好。我想要做的就是創建一個日期時間/時間戳作爲變量,並將其插入Oracle日期字段。 – Chris 2013-02-26 16:56:36

+0

我編輯了你的標題。請參見「[應的問題包括‘標籤’,在他們的頭銜?(http://meta.stackexchange.com/questions/19190/)」,這裏的共識是「不,他們不應該」。 – 2013-02-26 17:06:43

回答

1

參數化查詢是一個好的開始,因爲您可以將本機.Net DateTime對象傳遞到企業庫(例如)並指定它是DbType.DateTime並讓EL擔心它。但是,如果你不能這麼做,因爲你沒有使用EL或類似的東西,並且堅持使用發佈在你的問題中的SQL字符串,那麼你需要知道Oracle如何在內部處理日期,特別是關於格式。

使用SQL開發人員或SQLPLUS,執行以下命令:

Select To_Char(sysdate) from Dual; 

所顯示的格式是Oracle實例預計日期是如果你使用TO_DATE和Oracle將在TO_CHAR使用的格式。如果您在任何一個電話中都偏離該格式,那麼您將遇到問題。然而,無論默認格式的使用,你可以通過在調用中指定它覆蓋它:

ALTER SESSION SET NLS_DATE_FORMAT='YYYY/MM/DD HH:MI:SS'; 

Select To_Char(sysdate, 'YYYY/MM/DD HH:MI:SS') from Dual; 
Select To_Date('2013/02/26 05:03:27', 'YYYY/MM/DD HH:MI:SS') from Dual; 

您可以通過設置NLS_DATE_FORMAT參數設置要Oracle使用默認的隱

請注意,前面的說明僅更改執行的會話的默認。我們使用自定義格式在我們的Oracle系統,並確保我們得到它,我們的登錄觸發器後使用的所有會話:

create or replace TRIGGER NLS_Parameters_OnLogon AFTER LOGON ON SCHEMA BEGIN  

-- This makes the database case insensitive for sorting and searching and sets the default date format for TO_CHAR and TO_DATE  

    EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_COMP=LINGUISTIC'; 
    EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_SORT=BINARY_CI'; 
    EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_DATE_FORMAT=''YYYY/MM/DD HH:MI:SS'''; 
End; 

有可能通過編輯一些改變整個Oracle服務器的默認日期格式的Oracle配置文件,但由於我們必須部署到我們無法控制的客戶端服務器,因此我們使用此方法。

This article涵蓋了我剛剛在示例中所做的更多一點。

+0

哇。這幾乎涵蓋了所有這一切。非常感謝史蒂夫 – Chris 2013-02-26 17:30:32

+0

沒問題 - 我記得我經歷了相反的痛苦:我知道.Net方面,但從未使用過Oracle。正如Steven Doggart所說,使用參數化查詢是非常值得學習的。除了其他方面,它們可以使生活更輕鬆,並有助於防止SQL注入。許多框架可以幫助解決這個問題 - 我們在ODP和Instant Client中使用EL5/EntlibContrib。麻煩的一點是先讓堆棧工作,但它工作得很好。 – 2013-02-26 17:38:44

3

首先,你似乎混淆了一個DateTime對象和DateTime對象格式化String表示之間的差異。 Now,甚至更好,DateTime.Now已經是DateTime對象,因此將其格式設置爲字符串並解析字符串以再次將其返回DateTime值是沒有意義的。所以,你可以簡單地這樣做是爲了完成同樣的事情:

Dim timestamp As Date = Date.Now 

注意,在VB.NET,Date是是短期的DateTime,就像IntegerInt32「短」的關鍵詞。

其次,您不應該將DateTime值直接添加到SQL命令字符串中。您應該使用參數化查詢。將DateTime值附加到SQL字符串時,必須確保格式正確(通過調用timestamp.ToString(...))。然而不幸的是,哪種格式是合適的,完全取決於服務器的文化設置。因此,使用DB參數會更好,請將參數值設置爲等於實際的DateTime對象,然後讓DB提供程序爲您執行轉換。

+1

我想這就是我沒有閱讀手冊哈哈。爲此歡呼! – Chris 2013-02-26 17:06:59