【发布时间】:2020-01-19 23:47:27
【问题描述】:
我在 UWP 项目中使用The Microsoft.Data.Sqlite library 相关的 sqlite API。
我发现如果我在参数化 SQL 语句中使用IN 条件,它不会返回正确的结果。
例如,如果 SQL 语句如下所示:
sqliteCommand.CommandText = @"delete from [test_table] where col1 in(@para1,@para2)";
sqliteCommand.Parameters.Add(new SqliteParameter("@para1", '1'));
sqliteCommand.Parameters.Add(new SqliteParameter("@para2", '2'));
sqliteCommand.ExecuteNonQuery();
'col1' 为 '1' 或 '2' 时不会删除行。
如果我将 SQL 更改为:
sqliteCommand.CommandText = @"delete from [test_table] where col1 in(@para1,@para2)";
sqliteCommand.Parameters.Add(new SqliteParameter("@para1", "1"));
sqliteCommand.Parameters.Add(new SqliteParameter("@para2", "2"));
确实有效。
如果我将 SQL 更改为:
sqliteCommand.CommandText = @"delete from [test_table] where col1 in ('1', '2')";
sqliteCommand.ExecuteNonQuery();
有了这个,它也确实起作用了。
但是,如果我将 SQL 更改为:
delete from [test_table] where col1 in(@para1)
sqliteCommand.Parameters.Add(new SqliteParameter("@para1", "'1','2'"));
//or sqliteCommand.Parameters.Add(new SqliteParameter("@para1", "1,2"));
在这种情况下,它不起作用。
我认为微软需要调查这个问题。
“Microsoft.Data.Sqlite”库的版本是 2.2.6。
以下是整个代码演示:
SqliteConnection sqliteConnection = new SqliteConnection("Filename=test.db");
sqliteConnection.Open();
SqliteDataReader sqliteDataReader;
string sql = @"CREATE TABLE IF NOT EXISTS [test_table] ( col1 VARCHAR(1), col2 VARCHAR(1), col3 VARCHAR(4));";
SqliteCommand sqliteCommand = new SqliteCommand(sql, sqliteConnection);
sqliteCommand.ExecuteNonQuery();
sql = @"INSERT INTO [test_table] (col1, col2, col3) VALUES('1', '1', '0001')";
sqliteCommand.CommandText = sql;
sqliteCommand.ExecuteNonQuery();
sql = @"INSERT INTO [test_table] (col1, col2, col3) VALUES('2', '2', '0002')";
sqliteCommand.CommandText = sql;
sqliteCommand.ExecuteNonQuery();
sql = @"INSERT INTO [test_table] (col1, col2, col3) VALUES('3', '3', '0003')";
sqliteCommand.CommandText = sql;
sqliteCommand.ExecuteNonQuery();
sqliteCommand.CommandText = @"delete from [test_table] where col1 in(@para1,@para2)";
//sqliteCommand.CommandText = @"delete from [test_table] where col1 in('1','2')";
sqliteCommand.Parameters.Add(new SqliteParameter("@para1", '1'));
sqliteCommand.Parameters.Add(new SqliteParameter("@para2", '2'));
sqliteCommand.ExecuteNonQuery();
sqliteCommand.CommandText = @"select * from [test_table]";
sqliteDataReader = sqliteCommand.ExecuteReader();
【问题讨论】:
-
你的 SQLite 表中
col1的类型是什么? -
'1' 在 SQL (string) 和 C# (char) 中是不同的。您可以尝试改用
"吗?("@para1", "1"