我目前正在处理一个 C# 项目,并且我正在运行一个插入查询,该查询同时也执行一个选择,例如:
INSERT INTO table (SELECT * FROM table WHERE column=date)
有没有办法可以查看在此查询期间插入了多少行?
我目前正在处理一个 C# 项目,并且我正在运行一个插入查询,该查询同时也执行一个选择,例如:
INSERT INTO table (SELECT * FROM table WHERE column=date)
有没有办法可以查看在此查询期间插入了多少行?
ExecuteNonQuery
- 返回受影响的行数。
SqlCommand comm;
// other codes
int numberOfRecords = comm.ExecuteNonQuery();
如果您在 a 中运行您的问题的 SQLSqlCommand
并检查它的返回值,ExecuteNonQuery
应该会告诉您有多少记录受到影响。
从文档中:
返回值
类型:System.Int32
受影响的行数。
还要确保一件事您需要在连接字符串中添加一条语句例如:
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
因此它将返回受影响行的正确值
ExecuteNonQuery仅在设置了连接属性中的 Use Affected Rows 时返回受影响的行,如果没有(默认)返回匹配的行。
如果你运行大量的 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);
}
}
我意识到您正在尝试使用 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;