C# C MySQL使用循环添加多个相同参数
更新:由于最初的问题基本上得到了回答,我已经将其标记为完整 我有一个C项目,我想在其中查询数据库。SQL查询将从表中进行选择,在WHERE子句中,我希望从C中指定的预定义值列表中筛选结果C# C MySQL使用循环添加多个相同参数,c#,mysql,C#,Mysql,更新:由于最初的问题基本上得到了回答,我已经将其标记为完整 我有一个C项目,我想在其中查询数据库。SQL查询将从表中进行选择,在WHERE子句中,我希望从C中指定的预定义值列表中筛选结果 List<string> productNames = new List<string >() { "A", "B", "C" }; foreach (name in productNames) { string query = @" SELECT *
List<string> productNames = new List<string >() { "A", "B", "C" };
foreach (name in productNames)
{
string query = @"
SELECT *
FROM products
WHERE name IN (@name);";
// Execute query
MySqlCommand cmd = new MySqlCommand(query, dbConn);
cmd.Parameters.AddWithValue("name", name);
MySqlDataReader row = cmd.ExecuteReader();
while (row.Read())
{
// Process result
// ...
}
}
但是,我得到了一个错误:
已存在与此连接关联的打开的DataReader
必须先关闭哪个
那么,是否不可能使用for循环以这种方式将参数添加到SELECT语句中?您几乎没有做错什么。让我指出: 在循环的第一次迭代中一切正常,当您在第二次迭代中时,与命令关联的第一个读取器保持打开状态,这将导致当前错误。 您正在使用中的Where。。可以将中的值指定为逗号分隔的值,因此无需遍历参数。 可以使用String.Join方法用逗号分隔符构造此值。 现在查看以下代码:
List<int> productsIds = new List<int>() { 23, 46, 76, 88 };
string idInParameter = String.Join(",", productsIds);
// Create id as comma separated string
string query = "SELECT * FROM products WHERE id IN (@productId);";
MySqlCommand cmd = new MySqlCommand(query, dbConn);
cmd.Parameters.AddWithValue("@productId", idInParameter);
MySqlDataReader row = cmd.ExecuteReader();
while (row.Read())
{
// Process result
// ...
}
传递逗号分隔的productIds字符串,而不是循环。在中阅读更多关于
您得到的错误是因为您没有关闭MySqlDataReader。在下一次迭代中调用ExecuteReader之前,必须使用它来消除错误,但在这种情况下,这不是正确的方法 您需要处理对象以不获取异常。但是,您不需要迭代值并对列表中的每个值运行查询。请尝试以下代码。它为每个值生成一个参数,并将其添加到命令中以在中使用。。。条款 还可以使用关键字处理处理对象
List<string> productsIds = new List<string>() { "23", "46", "76", "88" };
string query = @"
SELECT *
FROM products
WHERE id IN ({0});";
// Execute query
using (MySqlCommand cmd = new MySqlCommand(query, dbConn))
{
int index = 0;
string sqlWhere = string.Empty;
foreach (string id in productsIds)
{
string parameterName = "@productId" + index++;
sqlWhere += string.IsNullOrWhiteSpace(sqlWhere) ? parameterName : ", " + parameterName;
cmd.Parameters.AddWithValue(parameterName, id);
}
query = string.Format(query, sqlWhere);
cmd.CommandText = query;
using (MySqlDataReader row = cmd.ExecuteReader())
{
while (row.Read())
{
// Process result
// ...
}
}
}
谢谢,这个有用。如果我想用一个字符串列表来代替,它是一样的吗?我是否必须将参数括在引号中,例如:…WHERE id in'@myString'@user2181948:我已经更新了答案,请看一看使用字符串时没有找到结果。。。但是,当我将idInParameter的值直接复制并粘贴到SQL查询中,并注释掉“cmd.Parameters.AddWithValueproductId,idInParameter”时,就会找到结果……您是否错过了cmd.Parameters.AddWithValue中的@?当我同时尝试使用@和否@时,会发现零个结果。这个符号的目的是什么?我以前只见过cmd.Parameters.AddWithValue,没有@符号
string productIdsCommaSeparated = string.Join(",", productsIds.Select(n => n.ToString()).ToArray())
string query = @"
SELECT *
FROM products
WHERE id IN (@productId);";
// Execute query
MySqlCommand cmd = new MySqlCommand(query, dbConn);
cmd.Parameters.AddWithValue("productId", productIdsCommaSeparated );
MySqlDataReader row = cmd.ExecuteReader();
while (row.Read())
{
// Process result
// ...
}
List<string> productsIds = new List<string>() { "23", "46", "76", "88" };
string query = @"
SELECT *
FROM products
WHERE id IN ({0});";
// Execute query
using (MySqlCommand cmd = new MySqlCommand(query, dbConn))
{
int index = 0;
string sqlWhere = string.Empty;
foreach (string id in productsIds)
{
string parameterName = "@productId" + index++;
sqlWhere += string.IsNullOrWhiteSpace(sqlWhere) ? parameterName : ", " + parameterName;
cmd.Parameters.AddWithValue(parameterName, id);
}
query = string.Format(query, sqlWhere);
cmd.CommandText = query;
using (MySqlDataReader row = cmd.ExecuteReader())
{
while (row.Read())
{
// Process result
// ...
}
}
}