首页 > 解决方案 > 在 C# Sqlite 中删除位置

问题描述

这个问题的重复,因为它没有得到满意的回答。 删除sqlite中的where in子句

在与原始海报 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

标签: c#stringsqlite

解决方案


我认为问题在于变量的值。尝试:

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

更新:正如约翰评论的那样,如果“UIDcsv”有某种用户输入,这将允许 SQL 注入。其他解决方案是:

1)在“IN”上使用“OR”(UID = @ID1 OR UID = @ID2 ...)

2)使用for循环添加“IN”条件中的值(为每个值添加一个参数并添加一个带有序列号(@ID1,@ID2等)的“IN”值


推荐阅读