如何在 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%";
我可以通过在 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%";