DELETE WHERE IN C# Sqlite [repicate] (删除)

问题描述 投票:0回答:1

此问题重复,因为没有得到满意的答复。删除 sqlite 中的 where 子句

在与原发帖者Cholo完全相同的情况下,我正在尝试一个简单的参数化删除语句。

string UIDcsv = "1, 2, 3, 4, 5, 6";
Console.WriteLine(UIDcsv);

var sqlite_DeleteEmployee = new SQLiteCommand(sqlite_Conn);
sqlite_DeleteEmployee.CommandText = "DELETE FROM myTable WHERE UID IN (@x);";
sqlite_DeleteEmployee.Parameters.AddWithValue("@x", UIDcsv);
sqlite_DeleteEmployee.Prepare();
sqlite_DeleteEmployee.ExecuteNonQuery();

就像Cholo在链接的 "已接受的回答 "中发现的那样,代码运行良好,但实际上并没有执行这个语句。这让我整个晚上都很沮丧。

现在我写了这个,我正在看我的其他代码,意识到这个C# Sql命令生成器很可能在命令中的@xyz周围自动添加引号,将UID列表变成一个单一的字符串。我如何阻止这种情况发生?

WriteLine的输出。

1, 2, 3, 4, 5, 6
c# string sqlite
1个回答
-3
投票

我认为问题出在变量的值上。

sqlite_DeleteEmployee.CommandText = "DELETE FROM myTable WHERE UID IN (" + UIDcsv +");";

更新:正如John评论的那样,如果 "UIDcsv "有某种用户输入,这将允许SQL注入。其他的解决方法有:1)使用 "OR "来代替 "UIDcsv"。

1) 在 "IN "上使用 "OR"(UID = @ID1 OR UID = @ID2 ...)。

2)使用for-loop来添加 "IN "条件下的值(对于每一个值,你都会添加一个参数,并添加一个带有顺序号的 "IN "值(@ID1,@ID2,等等

© www.soinside.com 2019 - 2024. All rights reserved.