我开始在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());
}
}
答案 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获取字符串时,也可以避免错误。