【问题标题】:Why SQL logical operators do not work in c# command?为什么 SQL 逻辑运算符在 c# 命令中不起作用?
【发布时间】:2014-04-10 07:14:21
【问题描述】:

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

        }
    }

【问题讨论】:

  • 当您在 SSMS 中尝试相同的查询时,您会得到什么 - 多少条目? select ID from Tweets where @VsTweetText=TweetText and ID&lt;@VsEndPoint and ID&gt;@VsStartPoint
  • 请注意(这也在我的回答中):您的查询还过滤了TweetText,因此您的要求我想获取起点和终点之间的ID不完整.它应该是我想在TweetText匹配给定值的起点和终点之间获取ID

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


【解决方案1】:

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

可能根本没有 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。

【讨论】:

  • 感谢您的关注@Thorsten Dittmar Select Top 1 解决了这个问题。
  • @Euphoria Strange - 它真的不应该有什么不同,因为 ExecuteScalar 被定义为返回 firstfirst 列的值i> 记录(无论该记录是什么)。 TOP 子句(连同ORDER BY)只是确保结果是可预测的。 请注意:没有ORDER BY,就不应该有TOP
【解决方案2】:

如果您从 SSMS 的查询中获得超过 1 个条目,您可能需要查看条件 - 为什么它返回多个条目。收紧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,它只能返回一个标量对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-28
    • 2020-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多