2012-04-18 85 views
0

我有用於從數據庫中檢索數據以下行代碼:如何使用日期和時間變量查詢數據庫?

DataTable newEquipmentTable = database.Connection.RetrieveData(database.AdapterType, string.Format("SELECT ID FROM Equipment WHERE Name = '{0}' AND CreatedOn = '{1}'", equipment.Name, equipment.CreatedOn.ToString("yyyy-MM-dd HH:mm:ss.fff"))); 

它返回一個錯誤說「varchar數據類型到datetime數據類型的轉換導致外的範圍內的值」

當我進行直接諮詢時,使用以下查詢將返回預期結果。

SELECT ID FROM Equipment WHERE Name = 'aa' AND CreatedOn = '2012-04-17 19:42:49.650' 

我在做什麼錯?

+3

注意SQL注入。設備的價值是什麼?創造了什麼? – Mr47 2012-04-18 13:13:14

+0

這是一個值'2012-04-17 19:42:49.650' – 2012-04-18 13:14:25

+2

你不能使用'正確的'參數查詢嗎? – 2012-04-18 13:14:54

回答

0

請注意,SQL的datetime類型不能保存1753-01-01之前的值。

只有使用調試器檢查SQL字符串,然後才能查詢數據庫以查找問題。

但是,最好的辦法是使用參數化查詢(如this example);否則你很容易受到SQL Injection的影響。

+0

這就是問題所在! 我的諮詢是在SQL的permited之前返回一個日期。 – 2012-04-18 13:43:10

+0

我很高興解決了它!另外,請儘量避免編寫參數化查詢;通過連接字符串構建SQL語句可能會導致SQL注入漏洞,這可能會給您帶來很大麻煩。 – GolfWolf 2012-04-18 13:47:33

2

您正在傳遞String值來選擇datetime字段。所以,你需要將其轉換爲datetime第一:

Convert(datetime,'2012-04-17 19:42:49.650', 102) 

除此之外,你可能會打開SQL-Injection爲@ Mr47提到,使用SqlParameters

+0

RetrieveData需要一個字符串查詢,所以我需要傳遞一個字符串作爲參數,而不是日期時間。 – 2012-04-18 13:45:47

+0

@GuilhermeCampos:這就是爲什麼我展示瞭如何將字符串轉換爲dbms端的datetime。您可以將'String.Format(「Convert(datetime,{0},102)」,equipment.CreatedOn.ToString(「yyyy-MM-dd HH:mm:ss.fff」))'傳遞給'RetrieveData'。 – 2012-04-18 13:53:19

0

equipment.CreatedOn的價值是多少?

我認爲在sql-server或您的應用程序中的文化設置問題。它不能直接隱藏你的日期。用戶文化設置將解決問題。

相關問題