2016-06-30 61 views
-1

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

目前我有设置生成的命令是这样的:

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配合使用时,管理这些值变得过于复杂,并且没有为提高可读性做任何事情。

回答

0

如何使用这样

... 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; 
    } 
} 
0

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

缩短或“清理”功能代码并没有多大作用,但会使功能更简单。


其实,只要功能的话,你也许可以做这样的事情......

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"}); 
} 
+0

除了有'schema'.'table''和'”之间的区别schema'.'table'' – MethodMan

+0

@MethodMan我不确定你想说什么。 – Uueerdo

+0

我仍然不确定你的意思。在我发布的任何地方都没有单引号,“'”是MySQL用来包含模式,表和字段名的东西。 (_“弄明白”_使它看起来像你正在拖曳,并且实际上不能指出问题。) – Uueerdo