删除C#Sqlite中的位置

删除C#Sqlite中的位置,c#,string,sqlite,C#,String,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 WHER

这个问题的副本,因为它没有得到满意的回答。

在与原始海报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();
与链接的“Accepted Answer”中的Cholo一样,代码运行良好,但实际上并不执行此语句。这让我整个晚上都很沮丧

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

写入线的输出:

1, 2, 3, 4, 5, 6

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

sqlite_DeleteEmployee.CommandText=“从myTable中删除,其中UID位于(“+UIDcsv+”)”

更新:正如John所评论的,如果“UIDcsv”有某种用户输入,这将允许SQL注入。其他解决办法包括:

1) 在(UID=@ID1或UID=@ID2…)中使用“或”insted on


2) 使用for循环在“in”条件下添加值(对于每个值,您添加一个参数,并添加一个带有序号(@ID1、@ID2等)的“in”值)

在中显示正确的参数化方法。我相信它也适用于SQLite。如果该方法不起作用-问题是您正确尝试了什么,并链接到副本,以及它如何不起作用的信息。请不要在您的答案中宣传SQL注入漏洞。我必须知道建议防范的全部范围SQL注入,但你是对的。由于他将var命名为“IDs”,我将假设它不是用户输入,而是从模型中选择的id。如果是这种情况,你可以使用string.join获取UIDcsv,但是,正如我所说,我不知道应用程序的全部范围。另一个解决方案是将OR的“id in(…)”替换为(可能)在这个用户的情况下很好,但就网站的工作方式而言,可能不仅仅是OP使用了您提供的代码。其他人可能会出于不同的目的使用它。