【问题标题】:DELETE WHERE IN C# Sqlite [duplicate]在 C# Sqlite 中删除位置 [重复]
【发布时间】:2020-04-23 23:12:43
【问题描述】:

这个问题的重复,因为它没有得到满意的回答。 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

【问题讨论】:

  • duplicate 显示了参数化 IN 的正确方法。我相信它也适用于 SQLite。如果该方法不起作用 - edit 问题与您正确尝试的内容并链接到副本以及它如何不起作用的信息。

标签: c# string sqlite


【解决方案1】:

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

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

更新:正如 John 所说,如果“UIDcsv”有某种用户输入,这将允许 SQL 注入。其他解决方案是:

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

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

【讨论】:

  • 请不要在您的回答中宣传 SQL 注入漏洞。
  • 我必须知道建议反对 SQL 注入的全部范围,但你是对的。由于他将 var 命名为“ID”,我将假设它不是用户输入,而是从模型中选择的 id。如果是这种情况,您可以使用 string.join 来获取 UIDcsv,但是,正如我所说,我不知道应用程序的全部范围。另一种解决方案是替换 OR 的“ID in (...)”。
  • 在这个用户的情况下(可能)没问题,但是根据网站的工作方式,可能不仅仅是 OP 使用您提供的代码。其他人可能会出现并将其用于不同的目的。
猜你喜欢
  • 2018-01-01
  • 1970-01-01
  • 2012-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多