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
C# C MySQL使用循环添加多个相同参数_C#_Mysql - Fatal编程技术网

C# C MySQL使用循环添加多个相同参数

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 *

更新:由于最初的问题基本上得到了回答,我已经将其标记为完整

我有一个C项目,我想在其中查询数据库。SQL查询将从表中进行选择,在WHERE子句中,我希望从C中指定的预定义值列表中筛选结果

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
                    // ...
                }
            }
        }