我可以通过在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注入。
如何在获取数据的同时编写安全代码?
3条答案
按热度按时间ujv3wf0j1#
通配符
%
应添加到参数值中,而不是参数名中而且,我不确定它在这里是否重要,但通常,我插入的参数名称与占位符(@wtName)中使用的名称完全相同
xzlaal3s2#
最简单方法是使用'||'
用途:
代替:
i86rm4rw3#
请尝试按如下方式定义查询: