如何在表中循环更新每一行

aor9mmx1  于 2021-06-21  发布在  Mysql
关注(0)|答案(4)|浏览(309)

我正在做一个项目,我必须在mysql中通过循环更新一个表,并更新c#中的每一行。注意:我只需要更新表中一列的值。
现在,我知道这个问题以前被问过很多次,但是在花了很多时间在网上搜索之后,我还没有找到解决问题的方法。
更多说明:
因此,我已经知道了一些使这项工作发挥作用的必要条件:
我知道如何建立(工作)ssh连接。
我知道如何建立(工作)mysql连接到我的数据库。
我知道如何运行/执行 SELECT 以及 UPDATE c#中的查询/命令。
所以我唯一需要做的就是让整个过程正常工作,就是循环本身。
现在,在我的研究中,我发现了一些建议使用 Reader . 我不知道这是否是我需要的,如果是的话,如何正确使用它。
下面是我到目前为止的代码(用于建立连接和执行查询)。
我的代码:

class ReaderDemo1
{
    public static void Update()
    {
        Console.WriteLine("[Core] Opening Connection To Database...");
        Database.openStockConn(Settings.databaseName, Settings.databaseUsername, Settings.databasePassword, Settings.sshHost, Settings.sshUsername, Settings.sshPassword);

        if (Database.stockConn.State != ConnectionState.Open)
        {
            Database.openStockConn(Settings.databaseName, Settings.databaseUsername, Settings.databasePassword, Settings.sshHost, Settings.sshUsername, Settings.sshPassword);
        }
        Console.WriteLine("[Core] database connection is now open!\n");

        MySqlCommand cmd = new MySqlCommand("SELECT value FROM catalog_product_entity_decimal", Database.stockConn);
        try
        {
            Console.WriteLine("[Price] Updating Prices...");

            MySqlCommand command = new MySqlCommand("UPDATE catalog_product_entity_decimal SET value= 1112 WHERE value_id= 4063", Database.stockConn);
            command.ExecuteNonQuery();

            Console.WriteLine("[Price] Prices Have Been Updated!");                
        }
        catch
        {
            Console.WriteLine("Updating Failed!");
        }
        finally
        {
            if (Database.stockConn != null)
            {
                Database.stockConn.Close();
            }
        }
    } 
}

只是想提供一些额外的背景: Database.cs 是我建立联系的地方( SSH 以及 MySql ) Settings.cs 是我所有登录数据的地方 SSH 以及 MySql 连接。
如果你们想知道,我已经尝试了一些关于循环的事情,但是(正如我已经提到的)这些尝试没有成功。
我对reader的尝试:

using (var reader = command.ExecuteReader())
{
     var indexOfValue = reader.GetOrdinal("value");

     while (reader.Read())
     {
          var price1 = reader.GetValue(indexOfValue);

           Console.WriteLine("Executing Update Command...");

           MySqlCommand cmd = new MySqlCommand("UPDATE catalog_product_entity_decimal SET value= 1222 WHERE entity_id= 759 AND entity_id= 839 AND entity_id= 881", con);
           cmd.ExecuteNonQuery();

           Console.WriteLine("Update Command Executed!"); 
    }
}

如前所述,上面的代码没有按我所希望的方式工作(可能是因为它现在实际上什么都没做)。只是想让你们知道,我并没有陷入错误。我只是不知道怎么做。
我希望你们中的一个人能帮我解决这个问题,或者给我指出正确的方向,如果你认为我的问题是另一个问题的重复,告诉我,我会调查的!:)提前谢谢。
谨致问候,
lks公司
编辑:
万一你们想知道,我的table就是这个样子。这个表包含大约5600行,所以这些只是最上面的行。

idfiyjo8

idfiyjo81#

您可以尝试此更改,方法是先计算行数,然后更新记录。

MySqlCommand cmd = new MySqlCommand("SELECT count(*) FROM catalog_product_entity_decimal", Database.stockConn);
    try
    {
        var reader = cmd .ExecuteReader();
        if(reader.Read()){
            var totalRows=reader.GetInt32(0);
            Console.WriteLine("[Price] Updating Prices...");

              while(totalRows-->0){
                    MySqlCommand command = new MySqlCommand("UPDATE catalog_product_entity_decimal SET value= 1112 WHERE value_id= 4063", Database.stockConn);
                    command.ExecuteNonQuery();

               }
            Console.WriteLine("[Price] Prices Have Been Updated!");   
        }             
    }
    catch
    {
        Console.WriteLine("Updating Failed!");
    }
    finally
    {
        if (Database.stockConn != null)
        {
            Database.stockConn.Close();
        }
    }
bwitn5fc

bwitn5fc2#

像frederiks answer一样,您现在要做的事情是在一个表上循环,并反复执行相同的查询。
即使您设法使代码正常工作,也会非常慢(因为您有大约5600行要更新)。
因此,我的建议是创建一个新表,其中包含新值(因此循环之后需要的值)。然后只运行一个update命令,用新表中的值更新旧表。
此选项可能需要几秒钟,而且会完成,因此速度要快得多!:)
您需要的查询应该如下所示:

UPDATE old_table
    INNER JOIN  new_table 
    USING (column) --> // if you want to update a specific column

编辑:
除了/更新我的答案之外,以下是您如何更准确地更新表格的方法:

UPDATE old_table
   INNER JOIN new_table ON old_table.value_id = new_table.value_id  // Use this to set your columns with unique values's
   SET old_table.value = new_table.value // For the column with the value's you want to update

因此,在上面的代码中,您可以更新 old_table 价值来自你的 new_table . 在本例中,您只从一列(您想要的)更新值。
您可以展开查询以获得不同的结果。

insrf1ej

insrf1ej3#

sql是基于集合的,这意味着几乎总是有比在表上循环更好的方法。你的问题也是这样。您希望避免在整个表上循环以逐个记录更新记录,因为这样做非常慢。
我并不清楚您要实现什么,因为您的代码示例在表上循环,然后在循环中,您反复执行相同的语句,但总是更新完全相同的记录?
如果要使用来自另一个表的信息更新表中的记录,可能需要查看update语句和join子句,如下所述。

wn9m85ua

wn9m85ua4#

我想不出任何理由让你想在循环中一次读一行,一次写一行,但你可以这样做。
使用一个sqlcommand进行读取,使用另一个sqlcommand进行更新。为每次更新更改循环中的参数。

public static void Update()
{
    Database.openStockConn(Settings.databaseName, Settings.databaseUsername, Settings.databasePassword, Settings.sshHost, Settings.sshUsername, Settings.sshPassword);

    if (Database.stockConn.State != ConnectionState.Open)
    {
        Database.openStockConn(Settings.databaseName, Settings.databaseUsername, Settings.databasePassword, Settings.sshHost, Settings.sshUsername, Settings.sshPassword);
    }
    Console.WriteLine("[Core] database connection is now open!\n");

    MySqlCommand cmd1 = new MySqlCommand("SELECT value FROM catalog_product_entity_decimal", Database.stockConn);
    MySqlCommand cmd2 = new MySqlCommand("UPDATE catalog_product_entity_decimal SET value= 1112 WHERE value_id= 4063", Database.stockConn);

    try
        {
            Console.WriteLine("[Price] Updating Prices...");

        using (var reader = cmd1.ExecuteReader())
        {
            var indexOfValue = reader.GetOrdinal("value");

            while (reader.Read())
            {
                var price1 = reader.GetValue(indexOfValue);

                Console.WriteLine("Executing Update Command...");

                cmd2.ExecuteNonQuery();

                Console.WriteLine("Update Command Executed!");
            }
        }
    }
    catch
    {
        Console.WriteLine("Updating Failed!");
    }
    finally
    {
        if (Database.stockConn != null)
        {
            Database.stockConn.Close();
        }
    }
}

相关问题