我可以通过在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"; 但用空格分隔参数和“whatever”运算符(“%”)也不起作用。
我可以通过将查询参数嵌入字符串中来进行复古 / kludgy 处理,就像这样:
const string qry = String.Format("SELECT SiteNum FROM WorkTable WHERE WTName LIKE {0}%", tableName);
...而不使用查询参数,但我担心如果这样做,Troy Hunt会出现在我的家门口,用床栏抽打我,并大声咒骂SQL注入。
我如何在获取数据的同时编写安全的代码?