如何在SQLite查询中使用变量?

时间:2019-02-18 22:48:19

标签: c# unity3d sqlite dapper

我开始在Unity项目中摆弄SQLite和Dapper,很快就偶然发现了我的第一个问题。 我希望能够用变量替换查询中的某些表达式(例如在WHERE条件下),例如,过滤列表中某列中包含某个字符串的条目的行。

在我的示例中,数据库包含名字和姓氏以及其他一些值。现在,我想读取所有以“ Lee”作为名字的行。如果我只是在查询中手动键入它,或者如果我使用一个参数并将该参数的值设置为Lee,那么这将非常好用。但是,如果我尝试将参数的值设置为某个字符串变量(例如从文本输入字段),则它将无法正常工作。

public void Read(string searchTerm)
{
    Debug.Log("Started searching for: " + searchTerm);
    SqliteConnection dbcon = new SqliteConnection(connection);
    dbcon.Open();

    var results = dbcon.Query<TestSubject>("SELECT * FROM TestTable WHERE first_name LIKE :a", new {a = searchTerm});

    foreach (TestSubject d in results)
    {
        Debug.Log("First Name: " + d.first_name.ToString());
        Debug.Log("Last Name: " + d.last_name.ToString());
        Debug.Log("Age: " + d.age.ToString());
    }

    dbcon.Close();
}

如前所述,如果我使用{a =“ Lee”},则会得到结果,但如果使用上述代码,其中searchTerm =“ Lee”,则不会得到结果。

我尝试了不同的语法,甚至研究了dapper(这对解决我的问题没有帮助,但使处理结果更容易)。我是在做错什么,还是SQLite无法做到?

编辑:我可能应该提到searchTerm字符串来自文本输入字段,并且在按下“搜索”按钮时会触发Read(...)函数。隐约记得在用代码实现用户生成的字符串之前遇到问题,但这应该有所不同,因为它仅在设置了字符串之后才执行,对吗?

EDIT2:我现在尝试了一些不同的尝试。我从查询中获取了整个表,并尝试在foreach-expression中使用条件过滤结果。可悲的是,它的行为与以前相同-如果我使用“ Lee”而不是searchTerm,它会起作用,如果我使用searchTerm,则它不会。但是,这表明该问题很可能与SQLite无关,而与其他问题有关。

var results = dbcon.Query<TestSubject>("SELECT * FROM TestTable");

foreach (TestSubject d in results)
{
    if (d.first_name.Contains(searchTerm))
    {
        Debug.Log("First Name: " + d.first_name.ToString());
        Debug.Log("Last Name: " + d.last_name.ToString());
        Debug.Log("Age: " + d.age.ToString());
    }
} 

2 个答案:

答案 0 :(得分:1)

搜索词应放在通配符%中。

类似的事情应该起作用:

var results = dbcon.Query<TestSubject>("SELECT * FROM TestTable WHERE first_name LIKE @a", new {a = "%" + searchTerm + "%"});

答案 1 :(得分:1)

问题显然是我为searchText字符串使用了TextMeshPro-Inputfield(而不是Unity的通用字段)。因此,即使在打印时看起来一样,但实际上并非如此。也许它使用不同的编码或不同的文化背景?无论如何,使用“正常”输入字段是可行的。感谢您提供的所有帮助和宝贵建议!

编辑:实际从TMP_Inputfield.text而不是TMP_Text.text获取字符串时,也可以避免错误。