在ExecuteNonQuery上获取受影响的行

时间:2012-04-07 23:19:37

标签: c# mysql .net sql executenonquery

我目前正在开发一个C#项目,我正在运行一个插入查询,它也同时进行选择,例如:

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

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

6 个答案:

答案 0 :(得分:81)

ExecuteNonQuery - 返回受影响的行数。

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

答案 1 :(得分:14)

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

来自documentation

  

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

答案 2 :(得分:1)

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

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 :(得分:0)

如果运行大量的ExecuteNonQuery()并将它们全部提交,则可以通过读取&#34; SELECT total_changes();&#34; <返回值来获取连接后的总更改数。 / p>

获得总变化的功能:

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

答案 4 :(得分:0)

ExecuteNonQuery返回受影响的行仅在设置连接属性中的“使用受影响的行”时,否则(默认)返​​回匹配的行。

答案 5 :(得分:0)

我知道您正在尝试使用 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;