2011-07-05 2 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 + "'" 

매우 간단하고 사용자가 미국의 형식으로 날짜를 입력하면 그것이 마치 마법처럼 작동합니다, mm/dd/yyyy. 그러나 영국 형식의 날짜가 25/05/2009와 같이 입력되면 실패합니다. 마지막으로 ...

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

... 내가 날짜를 선택하지 않기 때문에 특히, 도움이되지 않습니다 유사한 문은 WHERE 절에 사용할 수 있습니까?

도움 주셔서 감사합니다.

+11

참고 사항 : 당신은 매개 변수화 된 SQL을 사용해야합니다. SQL 문을 작성하기 위해 문자열 연결을 결코 사용하지 마십시오. – Heinzi

답변

3

DateTime.ParseExact method을 사용하여 사용자가 입력 한 값을 DateTime 데이터 형식으로 구문 분석하십시오. 이 방법을 사용하면 datetime의 형식을 지정할 수 있으므로 사용자 기본 설정에 따라 dd/MM/yyyy 또는 MM/dd/yyyy을 사용할 수 있습니다. 그런 다음 DateTime 값을 매개 변수로 SQL 문에 전달하십시오. 여기

는 블로그
  • 어떻게 매개 변수화 된 SQL 문을 사용하여 설명 포스트이며
  • SQL 별 문자열 연결 악 이유
  • : A와

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 injection 공격에 대해 소리가납니다. 그들에게 http://bobby-tables.com/을 보여주십시오. –