【问题标题】:Adding MySQL Parameters添加 MySQL 参数
【发布时间】:2016-06-30 17:55:38
【问题描述】:

有没有办法在创建实际对象之前为MySQLCommand 对象创建参数?

目前我必须像这样设置生成的命令:

public static MySqlCommand User(MySqlConnection MySQL, User u)
{
    var cmdVars = new List<string>();
    const string cmd = "SELECT * FROM `schema`.`table` WHERE 1=1 AND ";

    if (u.ID != null) cmdVars.Add("`ID` LIKE @0");
    if (u.Username != null) cmdVars.Add("`Username` LIKE @1");
    if (u.First != null) cmdVars.Add("`FirstName` LIKE @2");
    if (u.Last != null) cmdVars.Add("`LastName` LIKE @3");
    if (u.Phone != null) cmdVars.Add("`Phone` LIKE @4");
    if (u.Extension != null) cmdVars.Add("`Extension` LIKE @5");
    if (u.Email != null) cmdVars.Add("`Email` LIKE @6");

    var MySqlCmd = new MySqlCommand(cmd + string.Join(" AND ", cmdVars), MySQL);

    if (u.ID != null) MySqlCmd.Parameters.AddWithValue("@0", u.ID);
    if (u.Username != null) MySqlCmd.Parameters.AddWithValue("@1", u.Username);
    if (u.First != null) MySqlCmd.Parameters.AddWithValue("@2", u.First);
    if (u.Last != null) MySqlCmd.Parameters.AddWithValue("@3", u.Last);
    if (u.Phone != null) MySqlCmd.Parameters.AddWithValue("@4", u.Phone);
    if (u.Extension != null) MySqlCmd.Parameters.AddWithValue("@5", u.Extension);
    if (u.Email != null) MySqlCmd.Parameters.AddWithValue("@6", u.Email);

    return MySqlCmd;
}

虽然效果很好,但随着更多参数的添加,它看起来很粗糙,并且需要用户创建一个新的用户对象来搜索一个值。

我考虑切换到in this question 所示的方法,但在与 MySQLConnector 一起使用时,管理值变得过于复杂,并且对于提高可读性没有任何作用。

【问题讨论】:

    标签: c# mysql


    【解决方案1】:

    如何使用这样的查询

    ... WHERE (@0 is null or `ID` LIKE @0)
          AND (@1 is null or `Username` LIKE @1)
          AND (@2 is null or `FirstName` LIKE @2) ...
    

    然后无论是否为NULL,您都可以添加所有参数。

    在执行之前你可以运行这个

    private void FillNullValuesWithDbNull(SqlParameterCollection parameters)
    { 
        foreach (IDataParameter param in parameters)
        {
            if (param.Value == null) param.Value = DBNull.Value;
        }
    }
    

    【讨论】:

      【解决方案2】:

      我的建议不是将User 实例传递给函数,而是创建一个名为UserSearchCriteria 的新类;该类可以有一个更简单的设计(0 参数构造函数,所有具有简单设置器的属性,等等......)。

      缩短或“清理”函数代码不会有太大作用,但会使函数的使用更加简单。


      实际上,就功能而言,您可能可以做这样的事情......

      public static MySqlCommand User(MySqlConnection MySQL, UserSearchCriteria u)
      {
          var cmdVars = new List<string>();
          const string cmd = "SELECT * FROM `schema`.`table` WHERE 1=1 AND ";
      
          var MySqlCmd = new MySqlCommand("", MySQL);
      
          if (u.ID != null) 
          {
              cmdVars.Add("`ID` LIKE @0");
              MySqlCmd.Parameters.AddWithValue("@0", u.ID);
          }
          if (u.Username != null)
          { 
              cmdVars.Add("`Username` LIKE @1");
              MySqlCmd.Parameters.AddWithValue("@1", u.Username);
          }
      
          // and the rest of the relevant properties
      
          MySqlCmd.CommandText = cmd + string.Join(" AND ", cmdVars);
      
          return MySqlCmd;
      }
      
      public void somefunction()
      {
          var myCmd = User(someconnections, new UserSearchCriteria() {FirstName = "Joe"});
      }
      

      【讨论】:

      • 除了schema.table`` and 'schema.table'之间有区别``
      • @MethodMan 我不确定你想说什么。
      • 我还是不明白你的意思。我发布的任何地方都没有单引号,而“`”是 MySQL 中用来包含架构、表和字段名称的内容。 (“弄明白” 让您看起来像是在拖钓,实际上无法指出问题所在。)
      • 没关系.. 我确实指出了问题.. 看看他们向左倾斜的单个 tic 标记.. tilda 符号旁边的键盘上的那个 ~ 引号不正确一切都好... cmdVars.Add("`Username LIKE @1");
      • 正如我所说,` 是 MySql 模式、表和字段名称的正确分隔符,' 不是。 " 可以在某些配置下使用,但我认为' 在任何配置下都不会被 MySQL 识别为字符串分隔符。 Username LIKE @1 中的 Username 是字段名称,而不是字符串。除非参数 @1 的值是:用户名、%Username、Username% 或 %Username%,否则执行 'Username' LIKE @1 将始终为 false。
      猜你喜欢
      • 1970-01-01
      • 2011-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-14
      • 2021-03-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多