为什么在我的应用程序中没有返回行,而同一查询在DBBrowser中返回行?

问题描述

使用针对我的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

...我得到记录:

enter image description here

但要进行更多过滤:

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'):

enter image description here

但是,使用相同的查询,我执行获取在DBBrowser中返回的记录:

enter image description here

这是怎么回事?为什么同一个查询在我的应用程序中什么都不会返回,而从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

我尝试了以下所有排列,但没有一个返回任何数据:

  1. "AND (genres = @genre1 OR genres = @genre2) "

  2. "AND ((genres = @genre1) OR (genres = @genre2)) "

  3. "AND ((genres LIKE '%' || @genre1 || '%') OR (genres LIKE '%' || @genre2 || '%')) "

  4. AND (genres LIKE '%'+@genre1+'%' OR genres LIKE '%'+@genre2+'%')

  5. 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”不是列名,而是用单引号引起来:

enter image description here

因此,我尝试了以下所有排列,但没有一个返回任何记录:

// @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 (将#修改为@)