我目前正在开发一个C#项目,我正在运行一个插入查询,它也同时进行选择,例如:
INSERT INTO table (SELECT * FROM table WHERE column=date)
有没有办法可以看到在此查询期间插入了多少行?
答案 0 :(得分:81)
ExecuteNonQuery
- 返回受影响的行数。
SqlCommand comm;
// other codes
int numberOfRecords = comm.ExecuteNonQuery();
答案 1 :(得分:14)
如果您在SqlCommand
中运行问题中的SQL并检查ExecuteNonQuery
的返回值,则应该告诉您有多少记录受到影响。
返回值
类型: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;