生成MySQLCommand字符串

时间:2016-05-24 18:37:38

标签: c# mysql

是否有正确的方法来生成有效的MySQL字符串,然后通过MySqlCommand传递值?

我目前使用类似这样的方法,如果我需要搜索更多列,只需要堆叠越来越多的条件。它看起来如此严重我认为有更好的方法来完成同样的事情。

private static string SelectUser(User u)
{
    bool and = false;
    string cmd = "SELECT * FROM `database`.`users` WHERE ";

    if (u.ID != null)
    {
        cmd += "`UserID` LIKE @0";
        and = true;
    }
    if (u.Username != null)
    {
        if (and) { cmd += " AND "; }
        cmd += "`Username` LIKE @1";
        and = true;
    }
    if (u.Role != null)
    {
        if (and) { cmd += " AND "; }
        cmd += "`Role` LIKE @1";
        and = true;
    }
    if (u.Department != null)
    {
        if (and) { cmd += " AND "; }
        cmd += "`Departments` LIKE @1";
        and = true;
    }
    if (u.Template != null)
    {
        if (and) { cmd += " AND "; }
        cmd += "`Template` LIKE @1";
        and = true;
    }

    return cmd;
}

我发现了一些几乎可行的方法,例如this answer,但它们都不允许我通过MySqlCommand.Parameters模块化传递值。

1 个答案:

答案 0 :(得分:0)

要尝试的几件事。

首先,这样做:

   const string baseQuery = "SELECT * from database WHERE 1=1 AND ";

然后做

   var andClauses = new List<string>();
   if (U.id != null)  andClauses.Add("UserID = @0");
   if (U.username != null)  andClauses.Add("Username = @1");
   /* more like this */
   var query = baseQuery + string.Join (" AND ", andClauses);

这将在您的查询中为您提供一组连接的AND。它比你问题中的内容更清晰。

要考虑的另一个技巧:像这样编写你的查询

const string baseQuery = @"
     SELECT whatever
       FROM mytable
      WHERE (userid = @0 OR @0 <= 0)
        AND (username = @1 OR LENGTH(@1) <= 0)
        AND (department = @2 OR LENGTH(@department) <= 0) ";

这些(column = @val OR @val <= 0) WHERE子句允许您输入空字符串或零整数以有效地跳过该子句。

string = @"value";构造允许您在c#中编写多行字符串 - 非常方便您以有可能阅读它们的方式格式化查询。