2011-07-05 32 views
2

我設計了一個基於ASP/C#的搜索,用於搜索數據庫中的記錄,併爲用戶提供了可以使用的這些字段搜索:單詞/短語,dateFrom,dateTill。因此,分別輸入「Hello,World!」,05/25/2009,06/25/2009將搜索內容爲「Hello,World!」的數據庫記錄。這是在給定日期之間創建的。很簡單的東西。如何將SQL日期結果轉換爲英國格式(dd/mm/yyyy)

由用戶輸入到域中的文本直接注入SQL語句就像如下:

SELECT r.idRecord, r.recordText 
FROM record r 
WHERE LOWER(CAST(r.recordText AS VARCHAR)) LIKE LOWER('%" + word/phrase + "%') 
    AND r.creationDate BETWEEN '" + dateFrom + "' AND '" + dateTill + "'" 

所以還是非常簡單,當用戶在美國的格式輸入日期,它的工作原理就像一個魅力,毫米/日/年。但是,如果輸入英國格式的日期,例如25/05/2009,則失敗。最後...

SELECT CONVERT(VARCHAR(10), GETDATE(), 103) AS [DD/MM/YYYY] 

...沒有特別幫助,因爲我不想選擇日期,可以類似語句的WHERE子句中使用?

感謝您的幫助。

+11

作爲注意:你應該使用參數化的SQL。你不應該使用字符串連接來創建SQL語句。 – Heinzi

回答

3

使用DateTime.ParseExact method將用戶輸入的值解析爲DateTime數據類型。此方法允許您指定日期時間的格式,因此您可以根據用戶的偏好使用dd/MM/yyyyMM/dd/yyyy。然後將DateTime值作爲參數傳遞給您的SQL語句。

這裏是一個博客帖子,解釋

  • 如何使用參數化的SQL語句和
  • 爲什麼SQL按字符串拼接是邪惡:

Coding Horror: Give me parameterized SQL, or give me death

+0

謝謝你,Heinzi。 – bobble14988

4

Heinzi的評論根本不是一個側面提示:你應該在這裏使用參數化的SQL。這樣的話:

  • 你不必擔心你的日期/時間字段的格式,因爲你沒有提供的格式化版本的數據庫
  • 您不必擔心SQL注入爲您的文本字段
  • 你從乾淨的數據(日期,文字等)

您只需要在SQL不應包括動態值在所有分離的代碼(SQL) - 總是使用參數。示例見the documentation for SqlCommand.Parameters

+0

感謝這個信息。我是新手,基本上使現有的系統更適合用戶的需求。我看到各地都在使用動態值,所以我認爲這是很好的做法。我會改進我的技術。 – bobble14988

+1

@ bobble14988:然後請將您的發現傳遞給其他開發人員 - 代碼基本上可以通過它的聲音開放給SQL注入攻擊。向他們展示http://bobby-tables.com/。 –

相關問題