问题描述
使用针对我的SQLite数据库的简单查询:
SELECT MovieTitle,MPAARating,IMDBRating,DurationInMinutes,YearReleased,genres,actors,directors,screenwriters
FROM MOVIES_SINGLETABLE
WHERE IMDBRating >= @IMDBMinRating
ORDER BY IMDBRating DESC,YearReleased DESC LIMIT 1000
...我得到记录:
但要进行更多过滤:
SELECT MovieTitle,screenwriters
FROM MOVIES_SINGLETABLE
WHERE IMDBRating >= @IMDBMinRating
AND (YearReleased BETWEEN @EarliestYear AND @LatestYear)
AND (genres LIKE '%@genre1%' OR genres LIKE '%@genre2%')
AND (MPAARating = '@mpaaRating1')
ORDER BY IMDBRating DESC,YearReleased DESC LIMIT 1000
...我什么也没得到(是的,为所有这些参数分配了适当的值,即:5.0,'1958','2019','Drama','Western'和'PG'):
但是,使用相同的查询,我执行获取在DBBrowser中返回的记录:
这是怎么回事?为什么同一个查询在我的应用程序中什么都不会返回,而从DBBrowser中返回什么呢?
更新
根据流行的需求,这是将参数分配给的方式( genresSelected 是字符串列表):
if (GenresFiltered())
{
if (genresSelected.Count > 0)
{
cmd.Parameters.AddWithValue("@genre1",genresSelected[0].ToString());
}
if (genresSelected.Count > 1)
{
cmd.Parameters.AddWithValue("@genre2",genresSelected[1].ToString());
}
. . .
...以及在分配参数之前的查询字符串如下所示:
“ SELECT MovieTitle,MPAARating,IMDBRating,DurationInMinutes, 发行年份,类型,演员,导演,编剧来自 MOVIES_SINGLETABLE在哪里进行IMDBRating> = @IMDBMinRating AND YearReleased @EarliestYear AND @LatestYear AND之间(类型为'%@ genre1%',或 像'%@ genre2%'的流派或像'%@ genre3%'的流派 '%@ genre4%'或流派,如'%@ genre5%'或流派,如'%@ genre6%' 或类型,例如'%@ genre7%'或类型,例如'%@ genre8%'或类型 '%@ genre9%')和(MPAARating like'%@ mpaaRating1%')排序依据 IMDBRating DESC,年发行的DESC LIMIT 1000“
更新2
现在,最终查询查询字符串(已删除单引号):
选择MovieTitle,MPAARating,IMDBRating,DurationInMinutes, 发行年份,类型,演员,导演,编剧来自 MOVIES_SINGLETABLE在哪里进行IMDBRating> = @IMDBMinRating并且 (年份发布于@EarliestYear和@LatestYear之间)和(类型 @ genre1或类型@@ genre2)和(MPAARating = @ mpaaRating1)订单 通过IMDBRating DESC,年发行的DESC LIMIT 1000
我尝试了以下所有排列,但没有一个返回任何数据:
-
"AND (genres = @genre1 OR genres = @genre2) "
-
"AND ((genres = @genre1) OR (genres = @genre2)) "
-
"AND ((genres LIKE '%' || @genre1 || '%') OR (genres LIKE '%' || @genre2 || '%')) "
-
AND (genres LIKE '%'+@genre1+'%' OR genres LIKE '%'+@genre2+'%')
-
AND (genres LIKE @genre1 OR genres LIKE @genre2)
-with:cmd.Parameters.AddWithValue(“ @ genre1”,string.Format(“%{0}%”,genresSelected [0] .ToString())); cmd.Parameters.AddWithValue(“ @ genre2”,string.Format(“%{0}%”,genresSelected 1。ToString()));
更新3
尽我所能将来自forpas的想法整合进去,我能够在DBBrowser中获得返回的记录,但是在实际的应用程序中还没有。注释掉的行和下面用于过滤类型的现有行都可以使用。如果没有用单引号引起来的值,我会得到一个错误消息,内容是“ Western”不是列名,而是用单引号引起来:
因此,我尝试了以下所有排列,但没有一个返回任何记录:
// @genre1 and @genre2 not surrounded by single quotes
return "AND ((genres LIKE '%' || @genre1 || '%') OR (genres LIKE '%' || @genre2 || '%')) ";
// @genre1 and @genre2 surrounded by single quotes
return "AND ((genres LIKE '%' || '@genre1' || '%') OR (genres LIKE '%' || '@genre2' || '%')) ";
// @genre1 and @genre2 not surrounded by single quotes,string prepended with "@"
return @"AND ((genres LIKE '%' || @genre1 || '%') OR (genres LIKE '%' || @genre2 || '%')) ";
// @genre1 and @genre2 surrounded by single quotes,string prepended with "@"
return @"AND ((genres LIKE '%' || '@genre1' || '%') OR (genres LIKE '%' || '@genre2' || '%')) ";
然后,我想问题是:我如何在C#中产生与 在DBBrowser中工作的相同的SQL,即以下行:
AND ((genres LIKE '%' || 'Western' || '%') OR (genres LIKE '%' || 'Drama' || '%'))
注意:这也不会返回任何内容:
AND ((genres LIKE @genre1) OR (genres LIKE @genre2))
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)