我无法将查询更改为带有类似参数的参数化查询

时间:2017-08-29 10:49:12

标签: c# sql sqlite

我知道有很多关于这个主题的问题。但我尝试了一切,没有任何效果。正如我在标题中提到的,我试图将我的不安全查询更改为更安全的查询。

我认为问题是重点。我的目标是在查询中插入月份和年份。两者都应该用点分开。

就像这样:" .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。

我感谢任何建议或解决方案。

修改

它没有给我任何错误。调试时它正常运行。它只是在数据库中找不到任何内容。

2 个答案:

答案 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"

另见SQLite: SQL Select between dates

答案 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();
            }