Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MySQL查询在C中不起作用,但直接在数据库上执行时起作用_C#_Mysql - Fatal编程技术网

C# MySQL查询在C中不起作用,但直接在数据库上执行时起作用

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

在我的C项目中,我试图通过使用逗号分隔的字符串列表动态填充WHERE子句来查询数据库表:

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);