2013-10-01 3 views
-2

현재 SqlCommand의 where 절을 작성하려고합니다. 그것은이 아닌 것 같아매개 변수의 동적 where 절

myCommand.CommandText = "SELECT * " + 
         "FROM TABLE1 " + 
         "@whereClause"; 
//I build up the where clause with a StringBuilder 
myCommand.Parameters.AddWithValue("@whereClause" theClause.ToString()); 

비슷한하지만이 가능합니다. 나는 예외를 가지고 :

SQLEXCEPTION 근처의 구문이 잘못을 '@whereClause'

나는 데이터베이스 및이 방법에 X 호출을 피하기 위해 원하기 때문에 나는 이런 식으로 뭔가를하고 싶은 이유는 나는 서버에 정렬과 필터링을 맡긴다.

어쨌든 이와 비슷한 작업을 수행 할 수 있습니까?

/편집 : 어디 절은 마침내이 바보 같은 오타 오류로 인해했다 ... 나는 변수화 된 쿼리를 사용하지 않도록 변경 한 후이 WHERE (TABLE1.COL1 = 'the value' OR TABLE1.COL1 = 'another value' OR TABLE1.COL1 = 'this value' ...)

/편집과 같을 것입니다. 나는 내 도움을 누가 대답을 upvote거야. 내 바보 같은 버그를 고치지 않았더라도 내 상황을 해결하기 위해 더 가까운 곳에 무엇을 대답으로 표시 할 것인가?

+0

당신의'myCommand' 당신이 그것을 디버깅 할 때처럼 무엇 보이는입니다 실행할 수 있습니까? –

+0

@whereClause는 문자열이므로 아마도 인용됩니다. 왜'myCommand.CommandText = "SELECT *"+ "FROM TABLE1"+ theClause.ToString();을 사용하지 않는가? 또한'theClause' 접두사는'WHERE'인가? –

+0

TheClause.ToString()은 무엇을 반환합니까? –

답변

1

을 필요로 할 수 있음 - 그것은 작동하지 않습니다!

그래서

  • 이 분야의 List<WhereField> WHERE 절
  • 에 포함 할 모든 절을 AND로되어있는이

    SELECT * from TABLE1 WHERE [email protected] and [email protected] 
    

    같은 그리고 가정을 구축 할 필요가 가정

  • WhereField은 다음과 같습니다.

public class WhereField 
{ 
    public string FieldName{get;set;} 
    public object FieldValue{get;set;} 
    public string ComparisonOperator{get;set;} 
} 

는이 같은 있습니다

var whereClause = new StringBuilder(); 
    foreach (var field in WhereFields) 
    { 
    whereClause.Append(field.FieldName) 
    .Append(field.ComparisonOperator) 
    .Append("@") 
    .Append(field.FieldName).Append("Value") 
    .Append (" AND "); 
//add the parameter as well: 
    myCommand.Parameters.AddWithValue("",field.FieldName+"Value"); 
    } 
//cleanly close the where clause 
whereClause.Append("1=1"); 

을 그리고 지금 당신은

myCommand.CommandText = "SELECT * " + 
         "FROM TABLE1 WHERE " + whereClause.ToString(); 
+0

의 편집 내용을 확인하십시오.이 기능이 작동 할 것입니다. –

+0

동일한 필드를 테스트하고 있기 때문에 작동하지 않을지 모릅니다. 내 질문을 확인하여 where 절의 모양을 확인하십시오. –

+0

@im_a_noob 위의 샘플 코드를 수정하여 "AND"대신 "OR"를 추가 할 수 있으며 목록의 각 객체 (이 데이터를 나타내는 방법의 예일뿐입니다)은 같을 것입니다 FieldName 프로퍼티 - 복사 - 붙여 넣기 솔루션이 아니란 것을 명심하십시오.이 절을 작성하는 방법에 대한 예입니다. 요점은 전체 WHERE 절을 매개 변수에 넣지 않으려 고하는 것이 었습니다 - SQL과 실제 매개 변수 자체가 두 부분으로 분리되어 있어야합니다. –

1

(어디에)을 사용할 수 없으며, 매개 변수는 command.Parameters입니다.

동적 Where 절을 작성하려면 조건과 문자열 연결을 기반으로 쿼리를 작성한 다음 이에 따라 매개 변수를 추가해야합니다. 같은

뭔가 :

sb.Append("SELECT * FROM TABLE1 "); 

if (someCondition) 
{ 
    sb.Append("WHERE XColumn = @XColumn"); 
    myCommand.Parameters.AddWithValue("@XColumn", "SomeValue"); 
} 
else 
{ 
    sb.Append("WHERE YColumn = @YColumn"); 
    myCommand.Parameters.AddWithValue("@YColumn", "SomeOtherValue"); 
} 
myCommand.CommandText = sb.ToString(); 
0

당신이 그것을 매개 변수로 WHERE 절 전체를 추가하려는 것

myCommand.CommandText = "SELECT * " + 
         "FROM TABLE1 WHERE " + 
         "@whereClause"; 
+0

'@ whereClause'도'WHERE'를 가지고 있다면 어떨까요? –

+0

이 방법으로 시도했지만 작동하지 않습니다. –

+0

정확히이게 내 질문입니다. TheClause.ToString()은 무엇을 반환합니까 !! –