我想在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;
}
}
答案 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
匹配的范围。您可以调试以查看StartPoint
和EndPoint
的值是什么,以及数据库中是否存在严格位于TweetText
匹配的ID之间的ID。
您可以按如下方式更改语句,以包含StartPoint
和EndPoint
的值。
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。