我正在尝试在我的C#应用程序中构造一个MySQL查询,我想知道是否有可能在MySQL参数中使用OR语句。
我有一个名称列表,我想检查一下数据库中已经存在的名称。这是一个简短的例子
List<string> names = new List<string> {"adam", "bob", "cathy"}; //actual list is much longer
MySqlConnection connection = getAndOpenConnection();
MySqlCommand command = connection.CreateCommand();
command.CommandText = "SELECT * FROM Employees WHERE name = @names";
command.Parameters.Add(new MySqlParameters("@names", String.Format("names = {0}", String.Join(names, " or name = ")))); //is this line legal?
我最初的想法是用这种方式构造命令文本:
command.CommandText = String.Format("SELECT * FROM Employees WHERE name = '{0}'", String.Join(names, "' or name = '"))
该代码将为我提供所需的正确命令文本,但我确实想防止SQL注入。
有人可以帮我解决如何正确构造MySqlCommand吗?
不容易,不。您需要进行IN
查询,这是使用参数化的痛苦(您确实应该这样做)。基本上,您有两种选择:
后者比较容易;使用“ dapper”,这就是:
connection.Query("SELECT * FROM Employees WHERE name in @names", new { names })
.ToList();
(这将是一个List<dynamic>
;如果您有一个Employee
与列匹配的类,则可以connection.Query<Employee>(...).ToList()
用来获取一个List<Employee>
)。
但是,前者更像(对于简单版本):
var sb = new StringBuilder("SELECT * FROM Employees WHERE name=@name0");
cmd.Parameters.AddWithValue("name0", names[0]);
for(int i = 1; i < names.Count ; i++) {
sb.Append(" or name=@name").Append(i);
cmd.Parameters.AddWithValue("name" + i, names[i]);
}
cmd.CommandText = sb.ToString();
还有其他几种方法可以做到这一点:
switch(names.Count)
{
case 0: cmd.CommandText = "SELECT * FROM Employees"; break;
case 1:
cmd.CommandText = "SELECT * FROM Employees WHERE name=@name";
cmd.Parameters.AddWithValue("name", names[0]);
break;
default:
var sb = new StringBuilder(
"SELECT * FROM Employees WHERE name IN (@name0")
cmd.Parameters.AddWithValue("name0", names[0]);
for(int i = 1;i<names.Count;i++) {
sb.Append(",@name").Append(i);
cmd.Parameters.AddWithValue("name" + i, names[i]);
}
cmd.CommandText = sb.Append(")").ToString();
break;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句