【问题标题】:Get affected rows on ExecuteNonQuery在 ExecuteNonQuery 上获取受影响的行
【发布时间】:2012-04-20 23:55:14
【问题描述】:

我目前正在处理一个 C# 项目,我正在运行一个插入查询,该查询同时也执行一个选择,例如:

INSERT INTO table (SELECT * FROM table WHERE column=date)

有没有办法可以查看在此查询期间插入了多少行?

【问题讨论】:

    标签: c# mysql .net sql executenonquery


    【解决方案1】:

    我知道您正在尝试使用 ExecuteNonquery 执行此操作,但是 ExecuteScalar 并在您的查询中使用 OUTPUT 指令呢?

    对于插入:

    declare @resulttable
    (
      rowid int
    )
    insert yourtable
    output inserted.rowid
      into @resulttable
    select *
    from someothertable
    
    select count(1) affectedrows
    from @resulttable
    

    或者对于更新,如果您只想知道更改的行

    declare @resulttable
    (
      beforefield1 varchar(255),
      afterfield1 varchar(255)
    )
    update tbl1
    set field1 = replace(field1, 'oldstring', 'newstring')
    output deleted.field1,
        inserted.field1
      into @resulttable
    from someothertable
    
    select count(1) affectedrows
    from @resulttable
    where beforefield1 != afterfield1;
    

    【讨论】:

      【解决方案2】:

      还要确定一件事 您需要在连接字符串中添加一条语句 例如:

      string const "Server=localhost; PORT=3306; Database=db; User id=root; password='';UseAffectedRows=True";
      MySqlConnection con = new MySqlConnection(const);
      con.Open();
      MySqlCommand cmd = new MySqlCommand(con);
      cmd.CommandText = "Update db set table = value where Column = value";
      int numberOfRecords = cmd.ExecuteNonQuery();
      

      确保:

      UseAffectedRows=True
      

      因此它将返回受影响行的正确值

      【讨论】:

        【解决方案3】:

        ExecuteNonQuery 返回受影响的行ONLY WHEN 在连接属性中设置使用受影响的行,如果没有(默认)返​​回匹配的行。

        【讨论】:

          【解决方案4】:

          如果你运行大量的 ExecuteNonQuery(),并且一次全部提交,你可以通过从 "SELECT total_changes();" 中读取返回值来获取连接后的总更改数

          获取总变化的函数:

          public static long GetTotalChanges(SQLiteConnection m_dbConnection)
                  {
                      string sql = "SELECT total_changes();";
                      using (SQLiteCommand command = new SQLiteCommand(sql, m_dbConnection))
                      {
                          using (SQLiteDataReader reader = command.ExecuteReader())
                          {
                              reader.Read();
                              return (long)reader[0];
                          }
                      }
                  }
          

          在另一个函数中使用它:

          public static long MyBulkInserts()
                  {
                      using (SQLiteConnection m_dbConnection = new SQLiteConnection())
                      {
                          m_dbConnection.Open();
                          using (var cmd = new SQLiteCommand(m_dbConnection))
                          {
                              using (var transaction = m_dbConnection.BeginTransaction())
                              {
                                  //loop of bulk inserts
                                  {
                                      cmd.ExecuteNonQuery();
                                  }
                                  transaction.Commit();
                              }
                          }
                          return GetTotalChanges(m_dbConnection);
                      }
                  }
          

          【讨论】:

            【解决方案5】:

            ExecuteNonQuery - 返回受影响的行数。

            SqlCommand comm;
            // other codes
            int numberOfRecords = comm.ExecuteNonQuery();
            

            【讨论】:

            • 我正在这样做,出于某种原因,即使在我的表中创建了一个新行,此方法也会返回 -1。我的 sql 语句中也应该有一些东西吗?
            • SqlCommand.ExecuteNonQuery() 在执行插入/更新/删除时返回 -1 请参阅blogs.msdn.microsoft.com/spike/2009/01/27/…
            • 这并不总是像人们预期的那样工作。对于 UPDATE,返回的行数是 可能 已更改的行数,而不是实际更改的行数。假设您正在执行 UPDATE,其中最多 50 行可能会受到影响。但是,对于其中 35 行,UPDATE 不会导致任何数据更改。 50 个可能的行中只有 15 行的数据会发生变化。在这种情况下,人们希望“15”是返回值,但返回值是 50,即总行数。
            • @serv-inc,我认为没有办法通过一行代码获得“15”的更新。您需要单独执行 SELECT count() 语句 *before 运行更新以找出将要更新的行数。只要您的表被正确索引,这不会增加任何明显的额外开销。
            • @serv-inc:另一种选择是确保可能受影响的行数与实际受影响的行数相同。所以与其做“UPDATE table SET val1 = 5;”使用“UPDATE table SET val1 = 5 WHERE val1 5;”。
            【解决方案6】:

            如果您从SqlCommand 的问题中运行 SQL 并检查 ExecuteNonQuery 的返回值,它应该会告诉您有多少记录受到影响。

            来自documentation

            返回值
            类型:System.Int32
            受影响的行数。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2015-11-19
              • 2011-10-03
              • 2019-04-24
              • 1970-01-01
              • 2011-06-11
              • 2016-11-01
              • 2022-11-10
              • 2019-05-23
              相关资源
              最近更新 更多