2011-09-21 47 views
4

最近在T-SQL INSERT INTO語句中使用DateTime時出現問題。在一臺機器上工作良好,但可能無法在另一臺機器上工作,我想這與語言環境設置有關。T-SQL INSERT語句中的安全DateTime

因此,如果我有DateTime變量什麼是在SqlStatement字符串中使用它的安全方式,它將始終工作,無論本地系統設置如何?

感謝

回答

9

使用parameterizedINSERT查詢。

很可能,您的代碼正在組裝SQL命令字符串。這也使得你的代碼容易受到SQL Injection的影響。

+0

刪除了評論,認爲他們在TSQL中這樣做。只是注意到asp.net標籤。 –

+0

另一個問題是SQL DateTime範圍比.NET DateTime範圍小_smaller_。 – Oded

+1

@MartinSmith我看到的第一件事就是C#和ASP.NET標籤。然後我看到了你的評論,我想「我搞砸了嗎?」 :) –

0

您應該按照Adrian的建議使用參數化查詢。

另一種可能性是使用ISO 8601字符串表示,如描述的here,它與區域設置無關。

這將是這樣的:

20110921 15:20:00 
+0

實際上,只有最安全的格式是YYYYMMDD。如果包含時間,唯一真正安全的格式是YYYY-MM-DDTHH:MM:SS [...] –

+0

@Aaron:MSDN表示這是* unseparated * ISO8601。你的是分開的ISO8601。 – Jan

+0

對於輸入文字,這似乎很清楚:http://msdn.microsoft.com/en-us/library/ms190977%28SQL.90%29.aspx我沒有看到YYYYMMDD HH:MM:SS在那裏提到所有。我也沒有看到你的格式在ISO 8601列在這裏:http://msdn.microsoft.com/en-us/library/ms180878.aspx –

0

無論你使用,你的存儲創建DateTime類型的參數,參數化的命令/存儲過程和.NET代碼在調用存儲(所以它分配。 NET和SQL將知道他們正在使用日期時間,並且絕不會混淆/交換日期和月份),或者在插入命令的頂部包含特定命令,然後使用此模式格式化所有數據時間字符串,例如:

SET DATEFORMAT dmy; 

SET DATEFORMAT (Transact-SQL)