繁体   English   中英

C# - 如何循环通过表来更新每一行MySQL

[英]C# - How To Loop Through A Table To Update Each Row MySQL

我正在开发一个项目,我必须通过循环更新MySql中的表并在C#中更新每一行(逐个)。 注意:我必须更新表格中只有一列的值。

现在,我知道这个问题曾经被问过(很多次),但是在花了很多时间在互联网上搜索之后,我还没有找到解决问题的方法。

更多说明:

所以我已经知道了使这项工作成为必要的一些事情:

  • 我知道如何建立(工作)SSH连接。
  • 我知道如何建立与我的数据库的(工作)MySql连接。
  • 我知道如何在C#中运行/执行SELECTUPDATE Query / Command。

因此,我需要做的唯一一件事就是循环本身。

现在,在我的研究中,我发现了一些建议使用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是我创建连接的地方( SSHMySql
  • Settings.cs是我拥有SSHMySql连接的所有登录数据的地方。

如果你们想知道,我已经尝试了一些关于循环的事情但是(正如我已经提到的)这些尝试都没有成功。

我的尝试与读者:

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

编辑:

如果你们想知道, 就是我的表格。 该表包含大约5600行,因此这些行只是顶行。

我想不出你想要一次读一行并在循环中一次写一行的任何理由,但这就是你可以做到的。

使用一个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();
        }
    }
}

SQL是基于集合的,这意味着几乎总有一种更好的方法然后循环遍历表。 您的问题也是如此。 您希望避免循环遍历整个表以逐个记录更新,因为这非常慢。

关于你想要实现的目标对我来说并不明显,因为你的代码示例循环遍历一个表然后在你的循环中,你一遍又一遍地执行相同的语句,但你总是更新完全相同的记录?

如果您想更新与来自另一个表中的信息来表中的记录,你可能想看看UPDATE语句一起JOIN子句的解释在这里

就像Frederiks的回答一样,你现在要做的就是循环一个表并一遍又一遍地执行相同的Query。

即使你设法让你的代码工作,它也会非常慢(因为你有大约5600行要更新)。

所以我的建议是你创建一个包含新值的新表(所以你想在循环之后得到一个)。 然后只需运行一个更新命令,使用新表中的值更新旧表。

这个选项可能需要几秒钟才能完成,所以速度要快得多! :)

您需要的查询应该如下所示:

    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

因此,在上面的代码中,您使用new_table的值更新old_table 在此示例中,您只从一列(您想要的)更新值。

您可以展开查询以获得不同的结果。

您可以通过计算行数然后更新记录来尝试此更改。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM