【问题标题】:Check for value in Mysql if else update value如果更新值,则检查 Mysql 中的值
【发布时间】:2012-02-01 21:00:37
【问题描述】:

我有一个数据库,其中包含一些名为 UPC 标题描述和数量的列。我正在尝试检查列中是否已经存在 UPC 编号,如果确实存在,则将该条目的数量更新为 1,这是我到目前为止所拥有的:

    MySqlConnection connection = new MySqlConnection(MyConString);
                connection.Open();
                MySqlCommand command = connection.CreateCommand();
                command.CommandText = "INSERT INTO tableName " +
                           "(upc, title, description, quantity) " +
                       "VALUES " +
                           "(@upc, @title, @description, @quantity)";
                MySqlCommand upcCheck = connection.CreateCommand();
                upcCheck.CommandText = "Select COUNT (*) FROM tableName WHERE " +
                    "(upc=@upc) LIMIT 1";
                upcCheck.Parameters.AddWithValue("@upc", upc.Text); //Checks for duplicate UPCs
                MySqlDataReader check = upcCheck.ExecuteReader();
                    if( check.Read() != false)
                    {
                        command.Parameters.AddWithValue("@quantity",++); //not sure how to word it right
                    }


                command.Parameters.AddWithValue("@upc", upc.Text); //adding parameters SAFELY to the statement
                command.Parameters.AddWithValue("@title", titlename);
                command.Parameters.AddWithValue("@description", descname);
                command.Parameters.AddWithValue("@quantity", "1");

                MySqlDataReader result = command.ExecuteReader();

我只是不知道如何用它来进行检查。

更新!这是工作代码。

    MySqlConnection connection = new MySqlConnection(MyConString);

                connection.Open();
                MySqlCommand updatecommand = connection.CreateCommand();

                updatecommand.CommandText = "UPDATE tableName Set quantity = quantity +1 " +
                    "WHERE upc = @upc";
                updatecommand.Parameters.AddWithValue("@upc", upc.Text);
                using (MySqlDataReader updateResult = updatecommand.ExecuteReader())
                {


                    if (updateResult.RecordsAffected == 0)
                    {
                        affected = true;
                    }
                    else
                    {
                        affected = false;
                    }
                }
                 if(affected == true)
                {

                    MySqlCommand command = connection.CreateCommand();
                    command.CommandText = "INSERT INTO tableName " +
                        "(upc, title, description, quantity) " +
                    "VALUES " +
                        "(@upc, @title, @description, @quantity)";
                    command.Parameters.AddWithValue("@upc", upc.Text);
                    command.Parameters.AddWithValue("@title", titlename);//adding parameters SAFELY to the statement
                    command.Parameters.AddWithValue("@description", descname);
                    command.Parameters.AddWithValue("@quantity", "1");



                    MySqlDataReader result = command.ExecuteReader();
                }

【问题讨论】:

  • 您实际上可以为此使用 upsert - en.wikipedia.org/wiki/Upsert
  • 因此,如果我对插入或更新进行 upsert INSTEAD 操作,它会做或?
  • 是的,用一个 upsert 替换你的两个语句。逻辑是“如果它不存在则插入它,否则更新该行。”

标签: c# mysql winforms if-statement


【解决方案1】:

虽然我没有专门使用 MySqlDataReader,但我会稍微改变一下周围的查询……否则你为插入所使用的格式(参数化)完全没问题。

虽然 Hristo 提供的 ON DUPLICATE KEY UPDATE 很酷,但您可能会丢失其他列元素以供记录。我会改成..

MySqlCommand command = connection.CreateCommand();
command.CommandText = "UPDATE tableName Set Quantity = Quantity +1 " +
                           "WHERE upc = @upc"
command.Parameters.AddWithValue("@upc", upc.Text);

** 不知道 MySqlDataReader 将如何返回值/状态,但是

result = command.ExecuteReader();

if( the status indicates it actually succeeded in an update, 
    or how many records were updated > 0 )
  return;  // you've just increased the counter...

否则,它不在文件中。继续执行其余的 SQL 插入命令,我们可以覆盖最后一个命令实例...

command = connection.CreateCommand();
command.CommandText = "INSERT INTO tableName " +
                           "(upc, title, description, quantity) " +
                       "VALUES " +
                           "(@upc, @title, @description, @quantity)";

command.Parameters.AddWithValue("@upc", upc.Text);
command.Parameters.AddWithValue("@title", titlename);
command.Parameters.AddWithValue("@description", descname);
command.Parameters.AddWithValue("@quantity", "1");

result = command.ExecuteReader();

【讨论】:

  • 你的看起来可以工作,但检查更新是否成功的语法是什么?这是我唯一不清楚的部分。其他人对此解决方案有何帮助?
  • 我做到了!我做了: if(updateResult.RecordsAffected ==0) {做剩下的插入}
  • 遇到了问题,但我已经解决了。我将很快在原始帖子中编辑代码以反映如何做到这一点
  • @DevinPrejean,很高兴我能够在没有 EXACT 语法解决方案的情况下帮助指导,很多时候,只是以不同的方式看待任务的一点点推动就能让你走上正轨。现在,您对“updateResults.RecordsAffected”的评论也可以帮助其他人(除了我可能的未来)。
【解决方案2】:

如果 UPC 是您的主键,您可以使用 MySQL 数据库的INSERT ON DUPLICATE KEY UPDATE 功能。如果您不想INSERT 新的UPC 只需运行UPDATE 查询,如果没有这样的行不会影响表中的数据。

UPDATE <tablename> SET quantity=quantity+1 WHERE UPC='<upc>'

【讨论】:

  • 这不起作用,因为如果它在那里,它将更新。如果是,那么它将插入另一个 UPC 也不是主键,如果它不是主键,我可以这样做吗?
  • 如果没有它就会插入重复键,如果你只使用标准更新语句,它应该做你想做的事:如果数据库中存在产品,则增加数量。我听不懂你的问题吗
  • 如果你只有 UPC 的唯一值而不是 UPDATE SET quantity=quantity+1 WHERE UPC='' 应该做你的工作。否则它将更新多行。
  • 所以只是一个更新也将插入或者我是否必须执行您之前列出的“插入重复密钥更新”
  • NO UPDATE 只更新信息,只做 UPDATE 查询(NO INSERT UPDATE 不 INSERT)。如果我可以建议你看一下一些 MySQL 教程,关于基本查询,你会留下你正处于 MySQL 起步阶段的印象
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-27
  • 2019-05-12
  • 2018-04-12
  • 1970-01-01
  • 1970-01-01
  • 2014-01-18
  • 2022-01-06
相关资源
最近更新 更多