为什么SQL逻辑运算符在c#命令中不起作用

本文关键字:命令 不起作用 SQL 逻辑运算符 为什么 | 更新日期: 2023-09-27 17:57:38

我想获取起点和终点之间的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;
        }
    }

为什么SQL逻辑运算符在c#命令中不起作用

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

可能根本没有ID严格大于或严格小于TweetText匹配范围的推文。您可以进行调试,看看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

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

可能是这样的:

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

这将返回在该范围内找到的最大ID。

如果您从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

因为您使用的是只能返回单个标量对象的CCD_ 9。