在MySQL参数中使用OR语句

sora0419

我正在尝试在我的C#应用​​程序中构造一个MySQL查询,我想知道是否有可能在MySQL参数中使用OR语句。

我有一个名称列表,我想检查一下数据库中已经存在的名称。这是一个简短的例子

List<string> names = new List<string> {"adam", "bob", "cathy"}; //actual list is much longer
MySqlConnection connection = getAndOpenConnection();
MySqlCommand command = connection.CreateCommand();
command.CommandText = "SELECT * FROM Employees WHERE name = @names";
command.Parameters.Add(new MySqlParameters("@names", String.Format("names = {0}", String.Join(names, " or name = ")))); //is this line legal?

我最初的想法是用这种方式构造命令文本:

command.CommandText = String.Format("SELECT * FROM Employees WHERE name = '{0}'", String.Join(names, "' or name = '"))

该代码将为我提供所需的正确命令文本,但我确实想防止SQL注入。

有人可以帮我解决如何正确构造MySqlCommand吗?

马克·格雷韦尔

不容易,不。您需要进行IN查询,这是使用参数化的痛苦(您确实应该这样做)。基本上,您有两种选择:

  • 根据数组大小构建适当的命令和参数
  • 使用适合您的工具

后者比较容易;使用“ dapper”,这就是:

connection.Query("SELECT * FROM Employees WHERE name in @names", new { names })
          .ToList();

(这将是一个List<dynamic>;如果您有一个Employee与列匹配的类,则可以connection.Query<Employee>(...).ToList()用来获取一个List<Employee>)。

但是,前者更像(对于简单版本):

var sb = new StringBuilder("SELECT * FROM Employees WHERE name=@name0");
cmd.Parameters.AddWithValue("name0", names[0]);
for(int i = 1; i < names.Count ; i++) {
    sb.Append(" or name=@name").Append(i);
    cmd.Parameters.AddWithValue("name" + i, names[i]);
}
cmd.CommandText = sb.ToString();

还有其他几种方法可以做到这一点:

switch(names.Count)
{
    case 0: cmd.CommandText = "SELECT * FROM Employees"; break;
    case 1:
        cmd.CommandText = "SELECT * FROM Employees WHERE name=@name";
        cmd.Parameters.AddWithValue("name", names[0]);
        break;
    default:
        var sb = new StringBuilder(
            "SELECT * FROM Employees WHERE name IN (@name0")
        cmd.Parameters.AddWithValue("name0", names[0]);
        for(int i = 1;i<names.Count;i++) {
            sb.Append(",@name").Append(i);
            cmd.Parameters.AddWithValue("name" + i, names[i]);
        }
        cmd.CommandText = sb.Append(")").ToString();
        break;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在MySQL参数中使用OR语句

来自分类Dev

在MySQL中使用CASE / IF语句

来自分类Dev

在mysql中使用like语句

来自分类Dev

sql-在in语句中使用参数

来自分类Dev

在语句的“选择”部分中使用绑定参数

来自分类Dev

jQuery-在if语句参数中使用CSS

来自分类Dev

无法在SQL语句中使用参数

来自分类Dev

在if / else语句的参数中使用next()

来自分类Dev

并非在SQL语句中使用了所有参数(Python,MySQL)

来自分类Dev

在select语句中使用的MySQL存储过程解析日期参数

来自分类Dev

在select语句中使用的MySQL存储过程解析日期参数

来自分类Dev

在MySQL更新查询中使用IF语句

来自分类Dev

ORDER BY无法在MySQL中使用CONCAT语句

来自分类Dev

在MySQL中使用嵌套的case语句

来自分类Dev

在MySQL中使用PHP时和if语句

来自分类Dev

在mysql中使用select语句进行除法

来自分类Dev

如何在 mysql php 中使用 OR 语句

来自分类Dev

使用函数作为函数参数以在with语句中使用

来自分类Dev

在bash中使用内联if语句添加命令参数

来自分类Dev

在准备好的语句参数中使用表列

来自分类Dev

在所选参数中使用预准备语句

来自分类Dev

如何在重写语句中使用nginx if的参数$ 1

来自分类Dev

很难在FOR语句的addEventListener中使用CALLBACK的多个参数

来自分类Dev

如何在import语句中使用参数?

来自分类Dev

在Python函数中使用输入语句作为参数

来自分类Dev

我可以在函数参数中使用“ If”语句吗?

来自分类Dev

在RETURNING语句中使用Record as Function参数

来自分类Dev

在R中的if语句中使用for循环作为参数

来自分类Dev

如何在重写语句中使用nginx if的参数$ 1

Related 相关文章

热门标签

归档