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

shstlldc  于 2022-12-13  发布在  SQLite
关注(0)|答案(3)|浏览(162)

我可以通过在LINQPad中输入以下内容得到预期的结果:

SELECT * FROM WorkTable WHERE WTName LIKE "DSD__20090410014953000%"

(it显示了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”操作符(“%”)也不起作用。
我可以通过将查询参数嵌入到字符串中来进行复古/笨拙的操作,如下所示:

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

...完全不使用查询参数,但我担心如果我这样做,Troy Hunt会出现在我家,用床栏杆抽打我,同时抱怨SQL注入。
如何在获取数据的同时编写安全代码?

ujv3wf0j

ujv3wf0j1#

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

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

xzlaal3s

xzlaal3s2#

最简单方法是使用'||'

用途:

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

代替:

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

i86rm4rw3#

请尝试按如下方式定义查询:

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

相关问题