C# MySQL查询在C中不起作用,但直接在数据库上执行时起作用
在我的C项目中,我试图通过使用逗号分隔的字符串列表动态填充WHERE子句来查询数据库表:C# MySQL查询在C中不起作用,但直接在数据库上执行时起作用,c#,mysql,C#,Mysql,在我的C项目中,我试图通过使用逗号分隔的字符串列表动态填充WHERE子句来查询数据库表: List<string> productNames = new List<string>() { "A", "B", "C" }; // Construct SQL query string names = String.Join(",", productNames.Select(n => "'" + n.ToLower() + "'").ToArray()); // nam
List<string> productNames = new List<string>() { "A", "B", "C" };
// Construct SQL query
string names = String.Join(",", productNames.Select(n => "'" + n.ToLower() + "'").ToArray());
// names = 'a', 'b', 'c'
string query = "SELECT * FROM products WHERE LOWER(name) IN (@names);";
MySqlCommand cmd = new MySqlCommand(query, dbConn);
cmd.Parameters.AddWithValue("@names", names);
MySqlDataReader row = cmd.ExecuteReader();
while (row.Read())
{
// Zero rows returned
}
为什么这在我的C代码中不起作用?当您在中使用参数化查询时,应该为每个值使用一个参数。我的意思是,您不应该使用值为a、B、C的单个参数。相反,您应该使用这样的查询
"SELECT * FROM products WHERE LOWER(name) IN (@name1, @name2, @name3);"
关于你今天的另一个问题,我写了一个例子。请检查一下,Brain在他的博客文章中已经很好地解释了这一点。下面的答案摘自这篇文章: 您需要在数组中一次添加一个值
List<string> productNames = new List<string>() { "A", "B", "C" };
var parameters = new string[productNames.Count];
var cmd = new SqlCommand();
for (int i = 0; i < productNames.Count; i++)
{
parameters[i] = string.Format("@name{0}", i);
cmd.Parameters.AddWithValue(parameters[i], productNames[i]);
}
cmd.CommandText = string.Format("SELECT * FROM products WHERE LOWER(name) IN ({0})", string.Join(", ", parameters));
cmd.Connection = new SqlConnection(connStr);
请注意,sql语句中的{name}与我们发送给AddArrayParameters的参数名相同。AddArrayParameters将用正确的参数替换该值。您的C代码无法工作,因为此处
cmd.Parameters.AddWithValue("@names", names);
您传递的是一个值名称。它不作为三个参数。
因此,等效的sql查询如下
SELECT * FROM products WHERE LOWER(name) IN ("'a', 'b', 'c'");
而且找不到匹配项。要了解更多关于IN子句及其误解的信息,请看这篇漂亮的文章
理想情况下,参数必须是单个值。你可以这样做
SELECT * FROM products WHERE LOWER(name) IN (@name1, @name2, @name3);
它简单而干净。
但您也可以尝试在单个参数中传递多个值,如此处所述
并且在查询中正确地传递参数并完成。这太棒了,谢谢!只需将string.Joinseparator,parameterNames更改为string.Joinseparator,parameterNames.ToArray。请根据需要查看您的帖子和属性。@spender谢谢您指出我的错误,我已经更新了我的答案。
cmd.Parameters.AddWithValue("@names", names);
SELECT * FROM products WHERE LOWER(name) IN ("'a', 'b', 'c'");
SELECT * FROM products WHERE LOWER(name) IN (@name1, @name2, @name3);