59

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

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

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

4

6 回答 6

109

ExecuteNonQuery- 返回受影响的行数。

SqlCommand comm;
// other codes
int numberOfRecords = comm.ExecuteNonQuery();
于 2012-04-08T00:53:56.390 回答
15

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

文档中:

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

于 2012-04-07T23:24:34.510 回答
5

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

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

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

于 2019-09-12T12:00:49.830 回答
2

ExecuteNonQuery在设置了连接属性中的 Use Affected Rows 时返回受影响的行,如果没有(默认)返​​回匹配的行。

于 2018-11-30T00:21:01.630 回答
0

如果你运行大量的 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);
            }
        }
于 2018-02-25T03:14:13.620 回答
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;
于 2021-02-26T20:14:01.457 回答