有没有办法在创建实际对象之前为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时,管理值变得过于复杂,并且没有真正做任何事情来提高可读性。
答案 0 :(得分: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;
}
}
答案 1 :(得分:0)
我的建议是,不是将 std::map<int, my_struct> map_object;
实例传递给函数,而是创建一个名为User
之类的新类;该类可以有一个更简单的设计(0参数构造函数,所有属性与简单的setter等等)。
缩短或“清理”功能代码并没有太大作用,但会使功能更简单。
实际上,就功能而言,你可能会做这样的事情......
UserSearchCriteria