为什么SQL逻辑运算符不能在c#命令中工作?

时间:2014-04-10 07:14:21

标签: c# sql ado.net logical-operators

我想在Startpoint和EndPoint之间获取ID,但是我无法过滤查询。当我写的命令没有更大然后更少然后运算符它工作但搜索所有表。

我无法弄清楚如何解决这个问题。这是我的代码;你能帮助我吗?

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;

        }
    }

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

可能根本没有推文ID严格更大,严格小于TweetText匹配的范围。您可以调试以查看StartPointEndPoint的值是什么,以及数据库中是否存在严格位于TweetText匹配的ID之间的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。