是否有正确的方法来生成有效的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
模块化传递值。
答案 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#中编写多行字符串 - 非常方便您以有可能阅读它们的方式格式化查询。