重复这个问题,因为它没有得到满意的答复。Delete where in clause in sqlite
实际上,在与原始海报Cholo完全相同的场景中,我尝试了一个简单的参数化Delete语句。
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
发布于 2020-04-23 23:29:09
我认为问题在于变量的值。尝试:
sqlite_DeleteEmployee.CommandText = "DELETE FROM myTable WHERE UID IN (" + UIDcsv +");";
更新:正如John评论的那样,如果"UIDcsv“有某种用户输入,这将允许SQL注入。其他解决办法有:
1)在"IN“上使用" OR”(UID = @ID1或UID = @ID2 .)
2)使用for-循环来添加" in“条件下的值(对每个值添加一个参数,并添加一个带有序号(@ID1、@ID2等)的"IN”值)。
https://stackoverflow.com/questions/61398495
复制相似问题