c# - 在 MySQL 参数中使用 OR 语句

标签 c# mysql parameters

我正在尝试在我的 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 注入(inject)。

有人可以帮助我了解如何正确构建 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;
}

关于c# - 在 MySQL 参数中使用 OR 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24456105/

相关文章:

c# - 有条件地禁用 ASP.NET MVC Controller

c# - 在 C# 窗体上绘制圆圈后,我怎么知道我点击了哪个圆圈?

php - 选择查询中的两级联接

python - 多余的 python 参数

swift - 如何创建一个内联匿名函数,以便在函数调用中立即使用?

java - 将 Random 对象作为参数传递时出现问题

c# - 在数组中的特定索引中搜索特定数字

c# - 抽象单例背后的 IoC 容器——做错了吗?

php - 删除不同表中的条目 MysQL 查询

mysql - 什么版本的MYSQL支持存储过程?