2014-04-10 2 views
0

Startpoint와 EndPoint 사이에 ID를 가져오고 싶지만 쿼리를 필터링 할 수 없습니다. 내가 더 크고 작게 연산자를 쓰지 않으면 명령이 작동하지만 모든 테이블을 검색합니다.SQL 논리 연산자가 C# 명령에서 작동하지 않는 이유는 무엇입니까?

이 문제를 해결하는 방법을 알 수 없습니다. 여기 내 코드가있다. 도와 주실 수 있으신가요? 이유는 하나 개 이상의 항목을 반환 - 당신이 SSMS에서 쿼리에서 1 개 이상의 항목을받을 경우

public async Task<int> TaskSearchSqlTweetIDText(string TweetText, string Query, int StartPoint, int EndPoint) 
    { 
     SqlConnection conn = new SqlConnection(Tools.ConnectionString); 
     SqlCommand comm = new SqlCommand("select ID from Tweets where @VsTweetText=TweetText and ID<@VsEndPoint and ID>@VsStartPoint", conn); 

     comm.Parameters.AddWithValue("@VsTweetText", TweetText); 

     comm.Parameters.Add("@VsStartPoint", SqlDbType.Int); 
     comm.Parameters["@VsStartPoint"].Value = StartPoint; 

     comm.Parameters.Add("@VsEndPoint", SqlDbType.Int); 
     comm.Parameters["@VsEndPoint"].Value = EndPoint; 


     if (conn.State == ConnectionState.Closed) conn.Open(); 

     object sonuc = await comm.ExecuteScalarAsync(); 
     conn.Close(); 

     if (sonuc != null) 
     { 
      return (int)sonuc; 

     } 
     else 
     { 
      return 0; 

     } 
    } 
+0

SSMS에서 동일한 쿼리를 시도하면 무엇을 얻을 수 있습니까? 얼마나 많은 항목이 있습니까? '트위트에서 ID를 선택하십시오 @ VsTweetText = 트윗 텍스트 및 ID <@VsEndPoint 및 ID> @ VsStartPoint' – Nayan

+0

참고 : (또한 내 답변에 있음) : 귀하의 쿼리는 또한 'TweetText'를 필터링하므로 요구 사항 * 원하는 Startpoint와 EndPoint * 사이의 ID를 얻지 못합니다. 그것은 읽어야한다 * 나는 'TweetText'가 주어진 값 *과 일치하는 Startpoint와 EndPoint 사이에 ID를 얻고 싶다. –

답변

0

귀하의 질문에이 사실을 언급하지 않으므로 의 결과를 그대로 반환하지 않는다고 가정합니다.

아마 TweetText이 제공하는 범위보다 엄격하게 더 크고 엄격하게 작은 ID가있는 트윗이있을 수 있습니다. StartPointEndPoint의 값이 무엇인지보고 디버그 할 수 있으며 정확히 일치하는 데이터베이스의 ID가 정확히 일치하는 경우 TweetText이 일치합니다.

StartPointEndPoint의 값을 포함하도록 다음과 같이 명세서를 변경할 수 있습니다.

select ID from Tweets 
where @VsTweetText = TweetText 
    and ID <= @VsEndPoint 
    and ID >= @VsStartPoint 

또는

select ID from Tweets 
where @VsTweetText = TweetText 
    and ID BETWEEN @VsStartPoint AND @VsEndPoint 

또한 위의 문이 아주 잘 개 이상의 레코드를 반환 할 수 있습니다,하지만 당신은 첫 번째 ID를 사용하고, 그래서 당신은 당신의 코드에서 ExecuteScalar를 사용하십시오 당신은 무작위로 만난다. ID에 실제로 관심이있는 경우 어느 것이 더 예측 가능하도록 쿼리를 수정해야합니다. 어쩌면이 같은

: 범위 내에서 발견 된 가장 큰 ID를 반환

select top 1 ID from Tweets 
where @VsTweetText = TweetText 
    and ID BETWEEN @VsStartPoint AND @VsEndPoint 
order by ID desc 

.

+0

관심을 가져 주셔서 감사합니다. @Thorsten Dittmar 'Select Top 1'이 문제를 해결했습니다. – Euphoria

+0

@Euphoria Strange - 'ExecuteScalar'가 * first * 레코드의 * first * 열의 값을 반환하도록 정의되어 있으므로 (실제로 그 레코드가 무엇이든간에) 실제로 차이를 만들어서는 안됩니다. 'TOP' 절 ('ORDER BY'와 함께)은 결과가 예측 가능한지 확인합니다. ** 참고 : '주문'이없는 'TOP'이 없어야합니다! ** –

0

, 당신은 기준으로 볼 수도 있습니다. where 절을 조심스럽게 단단히 조입니다. 당신이 (당신이 할 경우)에만 첫 번째 항목을 얻으려면

where @VsTweetText = TweetText 
    and ID < @VsEndPoint 
    and ID > @VsStartPoint 

그러나,이를 사용

select top 1 ID from Tweets 
where @VsTweetText = TweetText 
    and ID < @VsEndPoint 
    and ID > @VsStartPoint 

당신은 단지 하나의 스칼라 객체를 반환 할 수 있습니다 ExecuteScalarAsync을 사용하고 있기 때문에.

+0

아주 대단히 '네안'톱 1 '문제를 해결해 주셔서 감사합니다. – Euphoria