2013-08-22 2 views
0

매개 변수가있는 쿼리에 검색 키로 nvarchar 값을 추가 할 때 거의 100 % 확신됩니다. 문제는 내가 아펙스트로피의 주위에 @exp이 내 자리 보유자로 의도 된 경우 쿼리가 @exp가 장소 보유자가 아닌 내 검색 키인 것으로 해석된다는 것입니다. 검색 키가 아포스트로피로 둘러싸여 있지 않으면 쿼리가 구문 적으로 올바르지 않다는 점을 제외하면 아포스트로피를 제거합니다. 실행 계획이 이미 평가되었고 검색 키 값이 말 그대로 스페인어가 아닌 '스페인어'가되기 때문에 매개 변수에 삽입되는 값에 아포스트로피를 추가 할 수는 없다고 설명되었습니다. 내 질문은이 문제를 어떻게 해결할 것인가입니다. 문제에 대한보다 자세한 배경은 아래 설명을 참조하십시오.문자열로 저장된 사용자 입력을 데이터베이스 필드와 비교할 수있는 매개 변수가있는 쿼리 만들기

제목 상태에는 매개 변수화를 사용하는 두 가지 동적 쿼리와 그렇지 않은 쿼리가 있습니다. 두 쿼리 모두 똑같은 작업을 수행하기위한 것입니다. 쿼리는 특정 언어로 1 차 또는 2 차 경험이있는 구성원 수를 반환하는 데 사용됩니다.

이렇게 쿼리가 설정되었습니다. 연결이 제대로 설정되고 두 쿼리에 사용되는 String exp의 값은 테스트를 위해 스페인어로 하드 코드됩니다.

SQl_Command.CommandText = "SELECT COUNT(ID) As MyCount FROM members WHERE ([Primary Exp] = @exp) AND ([Approved] = 'True') OR ([Approved] = 'True') AND ([Secondary Exp] = @exp)"; 
SQl_Command.Parameters.Add("@exp", SqlDbType.NVarChar, 255).Value = exp; 

나는 또한 시도 : 파라미터 사용

SQl_Command.CommandText = "SELECT COUNT(ID) As MyCount FROM members WHERE ([Primary Exp] = '" + exp + "') AND ([Approved] = 'True') OR ([Approved] = 'True') AND ([Secondary Exp] ='" + exp + "')"; 

: 파라미터를 사용하지

SqlParameter param = new SqlParameter("@exp", SqlDbType.NVarChar, 255); 
param.Value = exp; 
SQl_Command.Parameters.Add(param); 

나는 오류 방법과 관련이있다 확신한다 I 매개 변수에 값을 추가하거나 컨텍스트에서 SqlCommand에 매개 변수를 추가하는 방법 아포스트로피가 필요합니다. e가 검색 키를 둘러 쌉니다. 나는 당시의 CommandText에 아포스트로피를 넣으면 또한 쿼리 실행 내가

`SELECT COUNT(ID) As MyCount FROM members WHERE ([Primary Exp] = '@exp') AND ([Approved] = 'True') OR ([Approved] = 'True') AND ([Secondary Exp] = '@exp')` 

가 반환 @exp에 경험이있는 멤버를 검색을 의미 얻을 밖으로 반환을 명령 텍스트를 0으로 인쇄를 넣을 자리 표시자를 넣어 해당 항목이 없으므로 0입니다.

이 문제에 도움을 주시면 감사하겠습니다. 위의 설명에서 무언가를 잘못 언급했다면 알려 주시고 내가 왜 잘못되었는지 설명해 주시겠습니까?

+0

코드는 나에게 좋아 보인다. 매개 변수가있는 버전의 매개 변수 자리 표시 자 주위에 아포스트로피가 필요하지 않습니다. 오류가 발생했다는 말씀입니까? 그게 뭐야? 또한 승인 된 열의 데이터 유형은 무엇입니까? –

+0

이 코드는 웹 사이트에서 사용되며 사용자 입력은 링크를 클릭하여 전문 지식에 따라 페이지를 정렬 함으로서 발생합니다. @exp 주위에 아포스트로피없이 매개 변수화 된 쿼리를 사용하고 항목을 정렬하기 위해 링크를 클릭하면 페이지에 404 오류가 발생합니다. – TheDude

답변

2

Chris가 언급했듯이 매개 변수화 된 버전에는 아포스트로피가 필요하지 않습니다. 이는 그것이 NVarChar 유형이라고 명시하고 있기 때문입니다. 나는이 반면에

SQl_Command.CommandText = "SELECT COUNT(ID) As MyCount FROM members WHERE ([Primary Exp] = N'" + exp + "') AND ([Approved] = 'True') OR ([Approved] = 'True') AND ([Secondary Exp] = N'" + exp + "')"; 

이 될 것입니다 귀하의 비 매개 변수화 버전에서, 당신은 NVARCHAR 문자열을 검색하지 않는 것으로 나타났습니다,하지만, 자동으로이를이기 때문에 NVARCHAR 문자열을 사용하여 검색 할 매개 변수화 버전 유형이 지정됩니다. 데이터를 저장하는 방법 (NVarChar 대신 VarChar 문자열로 저장하는 것이 가능한가?)과 데이터에 유니 코드 문자가 포함되어 있는지 여부에 따라 두 결과 집합이 서로 다른 이유가 될 수 있습니다.또한 쿼리의 차이를보고 할 수 있습니다

는 대답으로이 게시 SQL Server 프로파일 러

사과를 사용하여 데이터베이스로 전송되고,하지만 난 그것을 게시 할 수있는 명성을 가지고 있겠지 의견 :

+0

그래서 NVarChar 대신 VarChar를 찾기 위해 매개 변수화 된 쿼리를 변경해야합니까? – TheDude

+0

유니 코드 문자를 사용할 필요가 없다면 문제가 해결 되겠지만 유니 코드 문자를 사용해야 할 경우 데이터베이스 저장 및 읽기가 NVarChar 문자열로 완료됩니다. 매개 변수화되지 않은 버전을 NVarChar로 변경 한 경우 404 오류가 발생하기 시작합니까? 그렇다면 NVarChar로 데이터를 저장하지 않는다고 말할 수 있습니다. 중요한 것은 일관성입니다. –

+0

불행히도 문제가 해결되지 않았습니다. 데이터베이스는 NVarChar로 데이터를 저장합니다. 내가 생각하는 코드의 다른 부분을 더 깊이 살펴야 할 것이다. – TheDude

관련 문제