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

How can I use the Like Operator with a Parameter in a SQLite query?

我可以通过在 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";但是用 space 分隔参数和 "whatever" 运算符 ("%") 也不起作用。

我可以 retro/kludgy 只需将查询参数嵌入到字符串中,如下所示:

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

...并且完全不使用查询参数,但我担心如果我这样做 Troy Hunt 会出现在我家并用床栏杆连枷我,同时围栏 SQL注射.

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

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

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) 中使用的名称完全相同

尝试像这样定义查询:

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

最简单的方法是使用“||”

使用:

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

代替:

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