2010-03-31 40 views
4

我有一個DateTime對象,我想與where子句中的sql datetime字段進行比較。我目前使用:在sql查詢中使用.net Datetime

"where (convert(dateTime, '" & datetimeVariable.ToString & "',103) <= DatetimeField)" 

但我相信datetimeVariable.ToString將返回具體情況取決於系統運行的是文化不同的值。

你會如何處理這個問題,這是文化獨立?

編輯:我不會在這個代碼使用paramatised SQL ...

編輯:下面巴馬對答案的一個註釋看起來像最好的方法可能是:

"where (convert(dateTime, '" & datetimeVariable.ToString("s") & "',126) <= DatetimeField)" 
+0

你爲什麼不使用參數? – 2010-03-31 12:09:34

+0

我正在更新遺留代碼,這是不是客戶面臨的,即沒有時間:( – Patrick 2010-03-31 12:11:49

+0

它不需要更多的時間來使用參數化查詢比它連接一個 – 2010-03-31 16:57:44

回答

1

如果你想的ToString()總是出來,無論文化,然後指定一個特定的文化:

Dim D = DateTime.Now.ToString(System.Globalization.CultureInfo.InvariantCulture) 
    '-or- 
    Dim D = DateTime.Now.ToString(New System.Globalization.CultureInfo("en-us")) 
+1

爲什麼你會推薦這個ISO日期格式,即DateTime.Now。 ToString(「s」),這個**應該**總是與SQL一起工作,因爲SQL盒可能有不同的文化? – ParmesanCodice 2010-03-31 13:14:34

+0

感謝Chris。(但是)如果你正在閱讀這個答案並思考,「那就怎麼做,「閱讀其他答案,找到一種更好的方法,但這並不符合我的要求。 – Patrick 2010-03-31 13:15:06

+0

@帕爾馬森,如果你有更好的方法,爲什麼不在分析中更全面地分享它? – Patrick 2010-03-31 13:16:06

7

唐不使用字符串連接,使用參數化查詢。傳遞DateTime類型的參數值。這避免了格式化問題,提高了後續查詢的性能,並避免了以這種方式構建SQL時所面臨的固有漏洞(SQL注入)。

"where @dateTime <= DateTimeField" 

然後設置參數@dateTime。如果您需要更多,請告訴我們更多關於您的代碼的信息 - 直接的ADO.NET,企業庫,還有其他的東西?

+0

應該在問題中提到, m工作在更新遺留代碼,這是非客戶所面臨的,將不會轉換整個應用程序(或甚至這部分)使用paramatised的sql – Patrick 2010-03-31 12:05:30

5

參數。始終參數:

where @someVar <= DatetimeField 

並添加一個名爲「@someVar」的參數。

解決(包括其他問題)i18n /編碼,串聯/注入和查詢計劃重用問題。