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

C# 如何在SQLite查询中对参数使用Like运算符?,c#,sqlite,sql-injection,sql-like,query-parameters,C#,Sqlite,Sql Injection,Sql Like,Query Parameters,我可以通过在LINQPad中输入以下内容获得预期结果: SELECT * FROM WorkTable WHERE WTName LIKE "DSD__20090410014953000%" (它显示了WTName值为DSD_uu20090410014953000.xml的记录) 但试图通过编程实现这一点证明是在尝试。我尝试了: const string qry = "SELECT SiteNum FROM WorkTable WHERE WTName LIKE @wtName%"; usin

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

SELECT * FROM WorkTable WHERE WTName LIKE "DSD__20090410014953000%"
(它显示了WTName值为DSD_uu20090410014953000.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);
…而且完全没有查询参数,但我担心如果我这样做了,会出现在我家里,并在抱怨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%";
而不是:

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

没有在SQLite上尝试,但它确实可以在SQL Server上运行。我从现有项目中复制了它。SQLite中字符串的连接运算符为| |,因此您应该编写
@wtName | |'%”
,但我仍然认为这太容易出错,而且不正确portable@Dragon您的答案对SQL Server有效,但对SQLite无效,正如我在SQLite中所说的那样您必须使用“| |”而不是“+”