我知道有很多关于这个主题的问题。但我尝试了一切,没有任何效果。正如我在标题中提到的,我试图将我的不安全查询更改为更安全的查询。
我认为问题是重点。我的目标是在查询中插入月份和年份。两者都应该用点分开。
就像这样:" .08.2017 "
有效的旧查询
string Query = @"select id from ferien WHERE Datum LIKE '%." + monat + "." + jahr + "'";
无效的新查询
String Query = @"select id from ferien WHERE Datum LIKE '%. @monat . @jahr'";
using (SQLiteCommand command = new SQLiteCommand(Query, sqlite_conn))
{
command.Parameters.Add("@monat", monat);
command.Parameters.Add("@jahr", jahr);
command.ExecuteNonQuery();
}
我使用的是sqlite db。
我感谢任何建议或解决方案。
修改
它没有给我任何错误。调试时它正常运行。它只是在数据库中找不到任何内容。
答案 0 :(得分:1)
修复您当前的方法:
您必须使用查询的固定部分 concat 参数,因此根据您的数据库,它将类似于
select id from ferien WHERE Datum LIKE '%.' || @monat || '.' || @jahr
或
select id from ferien WHERE Datum LIKE CONCAT('%.', @monat, '.', @jahr)
我认为使用公共||
SQL连接运算符的第一个也可以在SQLite中运行。 请注意,常见的+
运算符通常不适用于SQL中的字符串连接。
整个代码将成为
String Query = @"select id from ferien WHERE Datum LIKE '%' || @monat || '.' || @jahr";
using (SQLiteCommand command = new SQLiteCommand(Query, sqlite_conn))
{
command.Parameters.Add("@monat", monat);
command.Parameters.Add("@jahr", jahr);
command.ExecuteNonQuery();
}
(更好?)between
:
除此之外,如果您的数据库中有实际日期会更好,并且您将在查询中使用它,所以它看起来像:
select id from ferien WHERE Datum BETWEEN "2017-08-01" AND "2017-09-01"
答案 1 :(得分:0)
您没有以正确的方式使用参数,它们必须是单个值,不能用作字符串替换(就像您正在做的那样)。所以请改用
String Query = @"select id from ferien WHERE Datum LIKE @date";
using (SQLiteCommand command = new SQLiteCommand(Query, sqlite_conn))
{
command.Parameters.Add("@date", $".{monat}.{jahr}");
command.ExecuteNonQuery();
}