c# - 在 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
解决方案
我认为问题在于变量的值。尝试:
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”值
推荐阅读
- c# - 从 csv 文件(逗号分隔)导入两列或多列数据并使用 c# 跳过第一行
- macos - 在 Mac 上安装 psycopg2,找不到 pg_config 可执行文件
- python - 如何将二阶差分时间序列数据的 ARIMA 拟合值恢复为原始形式?
- r - R 中 CARET 中的训练、验证、测试拆分模型
- c - CS50 - PSet4(滤镜)- 模糊
- javascript - 如何在 jQuery/JavaScript 中获取行 ID onClick?
- ios - 将框架缓冲区运算符与 keepFull 策略相结合:它有什么作用?
- javascript - 如何将 TEMPLATE 元素附加到 shadow dom?
- python - Fast.ai learn.export() 在没有明显代码更改的情况下停止工作
- reactjs - React Hooks LocalStorage setState 覆盖元素