【发布时间】:2012-04-20 23:55:14
【问题描述】:
我目前正在处理一个 C# 项目,我正在运行一个插入查询,该查询同时也执行一个选择,例如:
INSERT INTO table (SELECT * FROM table WHERE column=date)
有没有办法可以查看在此查询期间插入了多少行?
【问题讨论】:
标签: c# mysql .net sql executenonquery
我目前正在处理一个 C# 项目,我正在运行一个插入查询,该查询同时也执行一个选择,例如:
INSERT INTO table (SELECT * FROM table WHERE column=date)
有没有办法可以查看在此查询期间插入了多少行?
【问题讨论】:
标签: c# mysql .net sql executenonquery
我知道您正在尝试使用 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;
【讨论】:
还要确定一件事 您需要在连接字符串中添加一条语句 例如:
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 返回受影响的行ONLY WHEN 在连接属性中设置使用受影响的行,如果没有(默认)返回匹配的行。
【讨论】:
如果你运行大量的 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 - 返回受影响的行数。
SqlCommand comm;
// other codes
int numberOfRecords = comm.ExecuteNonQuery();
【讨论】:
如果您从SqlCommand 的问题中运行 SQL 并检查 ExecuteNonQuery 的返回值,它应该会告诉您有多少记录受到影响。
返回值
类型:System.Int32
受影响的行数。
【讨论】: