2011-05-02 2 views
6

나는 기본적으로 내가 뭘하려고 오전 데이터베이스의 배우 테이블에서 특정 배우의 정보를 얻을 수있다이 양식변수 사용 (C#을)

string cmdText = "Select * from " + searchTable 
    + "WHERE " + searchTable 
    + "Name =' " + searchValue + "'"; 

의 SQL 쿼리가 있습니다. 변수 searchTable은 테이블 이름 인 'Actor'값을 가지며 searchValue는 액터의 이름을가집니다. 액터의 테이블에있는 ActorName 속성으로 표현됩니다. 여기서 'Actor'라는 단어를 연결하여 속성의 이름을 구성하려고합니다. '과'이름 ')

가 그래서, 음, 모든이 연결 결과 (또는 이상) 형식의 쿼리 결과를해야

:이 실행하려고하면

Select * from Actor where ActorName ='some actor'; 

을하지만 그것은 나를 준다 오류 "잘못된 구문 근처 '='"브라우저에서. 아무도 도와 줄 수 없습니까?

답변

5

SQL Injection attacks까지 열리므로 문자열을 SQL에 연결하면 안됩니다.

This은 동적 SQL에 대해 다소 오랫동안 읽었지 만 위험 및 옵션을 이해하는 데 가치가 있습니다.

테이블 이름을 매개 변수로 사용하는 유일한 방법은 동적 SQL을 사용하는 것이지만 parameterized queries을 사용해야합니다.

테이블 이름과 관련된 접근 방식을 변경하는 것이 좋습니다 - 장래에 문제가 발생할 수 있습니다. 이는 유지 관리 할 수 ​​없으며 위에서 언급 한 것처럼 SQL 주입을 열 수 있습니다.


표시되는 오류는 "Where"절을 사용하여 연결 한 결과입니다. 앞에 공백이 없습니다. 또한 "Name"으로 끝나는 매개 변수에 ' 뒤에 공백을 추가합니다.

귀하의 결과 문자열, 귀하의 예제를 사용하는 것 :

Select * from ActorWHERE ActorName =' some actor'; 
+0

답장을 보내 주셔서 감사합니다. – QPTR

+0

링크를 제공해 주셔서 감사합니다! 나는 그들을 사용하려고 노력할 것이다. – QPTR

8

당신은 넣을 수 있습니다 (그리고 한다!) 매개 변수를 사용자의 SQL 쿼리에 들어있는 값 WHERE 조항 -하지만 에 테이블 이름과 같은 매개 변수를 넣을 수 없습니다.

SELECT (list of columns) 
FROM dbo.Actor 
WHERE ActorName = @ActorName 

을 다음 @ActorName만을위한 가치 전달 :

그래서 나는 것으로 해당 쿼리를 다시 작성할 것입니다. 당신이 이사 같은 일을해야하는 경우 보안 (금지 SQL 주입 공격을 강화

, 당신은이

  • 같은 매개 변수를 사용하여 두 번째 쿼리를

    SELECT (list of columns) 
    FROM dbo.Directors 
    WHERE DirectorName = @DirectorName 
    

    이해야 할 것!, 셋째 해당 쿼리에 대한 쿼리 계획이 캐시 및 초 동안 재사용 할 수

PS를 실행합니다 :)

  • 은 성능을 향상 셋업에서 원래의 문제는 이것이다 : 첫 번째 사이에 공간이없는 테이블 이름의 선두로부터와 WHERE 절 - 따라서 당신이 얻을 것이다 :

    SELECT * FROM ActorWHERE ActorName ='.....' 
    

    당신이 정말로 (! 내가 하지 그것을 추천 할 것입니다) 함께 SQL 문을 연결 주장하는 경우에, 당신은 공간을 둘 필요 테이블 이름과사이 0!

    업데이트 : ADO.NET에서 매개 변수화 된 쿼리에 대한 학습을위한 일부 리소스 :

  • +0

    답장을 보내 주셔서 감사합니다. asp.net 및 C#에 매우 익숙하며 강사가 방금 연결을 완료했습니다. 즉, 매개 변수화 된 쿼리에 대해 더 많이 알고 싶습니다. 검색해 보았지만 만족스런 소개를 찾을 수 없었습니다. 코드 예제를 사용하면 링크 할 수 있습니까? 어쨌든, 도와 줘서 고마워! – QPTR

    +0

    @QPTR : 일부 리소스 링크 추가 –

    +0

    링크를 제공해 주셔서 감사합니다! – QPTR

    1

    하나 너무 많이가 빈 누락과 :

    searchTable + "Name =' " 
    

    읽어야합니다

    searchTable + " Name ='" 
    

    게다가 SQL 주입을 막기 위해 SQL 매개 변수를 사용하십시오.

    +0

    답장을 보내 주셔서 감사합니다. 공백을 인식하지 못했지만 지금은 작동합니다. – QPTR

    -1
    string cmdText = "Select * from " + searchTable + " WHERE Name = '" + searchValue + "'"; 
    
    +0

    답장을 보내 주셔서 감사합니다, 지금 작동합니다! – QPTR