2014-04-10 32 views
0

我想在Startpoint和EndPoint之间获取ID,但无法过滤query.When编写命令时没有那么大,那么运算符就可以工作,但会搜索所有表。为什么SQL逻辑运算符在c#命令中不起作用?

我找不出如何解决这个问题。这是我的代码;请你能帮助我吗?

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 = TweetText和ID <@VsEndPoint和ID> @ VsStartPoint' – Nayan

+0

请注意(这也在我的答案中):您的查询也为'TweetText'过滤,所以您的要求*我想在Startpoint和EndPoint *之间获取ID不完整。它应该读取*我想在TweetText与给定值*匹配的Startpoint和EndPoint之间获取ID。 –

回答

0

你没有在你的问题中说明这一点,所以我假设你没有从查询中得到任何结果,因为它是?

也许根本没有ID的严格更大,严格小于您提供的范围TweetText匹配的推文。您可以调试以查看StartPointEndPoint的值,以及数据库中是否确实存在与TweetText匹配的严格位于它们之间的ID。

您可以更改语句如下,以包含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 

也请注意,上面的语句很可能返回多个记录,但你在代码中使用ExecuteScalar,让你在使用的第一个ID你遇到 - 随机。如果你真的只对一个 ID感兴趣,你应该修改你的查询,以便更容易预测哪一个被选择。

也许是这样的:

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

这将返回范围内发现的最大ID。

+0

感谢您的关注@Thorsten Dittmar'Select Top 1'解决了这个问题。 – Euphoria

+0

@Euphoria奇怪 - 它确实不应该有所作为,因为'ExecuteScalar'被定义为返回* first *记录的* first *列的值(不管那条记录是什么)。 'TOP'条款(和'ORDER BY'一起)确保结果是可预测的。 **请注意:如果没有'ORDER BY',应该没有'TOP'!** –

0

如果您在SSMS中的查询中获得了多个条目,您可能需要查看条件 - 为什么它返回多个条目。收紧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

非常感谢你@Nayan'Top 1'解决了问题。 – Euphoria