如何在SQLite查询中使用参数与Like运算符?

11

我可以通过在LINQPad中输入以下内容来获得我期望的结果:

SELECT * FROM WorkTable WHERE WTName LIKE "DSD__20090410014953000%"

它向我展示了一个WTName值为“DSD__20090410014953000.xml”的记录。

但是尝试以编程方式实现这一点正在变得困难。我尝试了:

const string qry = "SELECT SiteNum FROM WorkTable WHERE WTName LIKE @wtName%";
using (SQLiteConnection con = new SQLiteConnection(HHSUtils.GetDBConnection()))
{
    con.Open();
    SQLiteCommand cmd = new SQLiteCommand(qry, con);
    cmd.Parameters.Add(new SQLiteParameter("wtName", tableName));
    siteNum = Convert.ToInt32(cmd.ExecuteScalar());
}

...但是它导致应用程序崩溃,我的日志文件告诉我原因:

Message: From application-wide exception handler: System.Data.SQLite.SQLiteException: SQL logic error or missing database
near "%": syntax error

也许它认为查询参数名为"wtName%"而不是"wtName"; 但用空格分隔参数和“whatever”运算符(“%”)也不起作用。

我可以通过将查询参数嵌入字符串中来进行复古 / kludgy 处理,就像这样:

const string qry = String.Format("SELECT SiteNum FROM WorkTable WHERE WTName LIKE {0}%", tableName);

...而不使用查询参数,但我担心如果这样做,Troy Hunt会出现在我的家门口,用床栏抽打我,并大声咒骂SQL注入。

我如何在获取数据的同时编写安全的代码?

3个回答

17

通配符%应该添加到参数值中,而不是参数名称中。

const string qry = "SELECT SiteNum FROM WorkTable WHERE WTName LIKE @wtName";
using (SQLiteConnection con = new SQLiteConnection(HHSUtils.GetDBConnection()))
{
    con.Open();
    SQLiteCommand cmd = new SQLiteCommand(qry, con);
    cmd.Parameters.Add(new SQLiteParameter("@wtName", tableName + "%"));
    siteNum = Convert.ToInt32(cmd.ExecuteScalar());
}

我不确定这是否在此处有影响,但通常我会使用占位符中精确的名称(@wtName)插入参数名称。


9
最简单的方法是使用“||”符号。
使用方法:
const string qry = "SELECT SiteNum FROM WorkTable WHERE WTName LIKE @wtName || '%' ";

改为:

const string qry = "SELECT SiteNum FROM WorkTable WHERE WTName LIKE @wtName%";

为什么要做一个而不是另一个? - Reteras

-2

尝试像这样定义查询:

const string qry = "SELECT SiteNum FROM WorkTable WHERE WTName LIKE @wtName + '%'";

没有在 SQLite 上尝试过,但是在 SQL Server 上肯定可以工作。我将它从现有项目中复制而来。 - Dragan
SQLite中字符串的连接运算符是||,因此您应该编写@wtName || '%'。尽管如此,我仍然认为这太容易出错且不可移植。 - Steve
@Dragon你的答案对于SQL Server是有效的,但不适用于SQLite,因为我在SQLite中回答时必须使用“||”而不是“+”。 - Kas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接