.net 的 SqlCommand.ExecuteNonQuery 返回命令影响的行数,这个行数是指的总行数,
包括 每一条语句影响的行数,以及触发器(如果有的话)影响的行数。
比如有一个学生表 student(name nvarchar(50))
然后有一个日志表logs(title,datecreated date default getdate())
在学生表上有两个触发器,分别记录insert 和delete操作到日志表
Create TRIGGER [LogStudentInsert]
ON [dbo].[students]
AFTER INSERT
AS
BEGIN
--SET NOCOUNT ON;
declare @cnt int
select @cnt=count(*) from inserted
insert into logs(title) values('inserted '+convert(nvarchar(10),@cnt)+' rows')
END
Create TRIGGER [LogStudentDelete]
ON [dbo].[students]
AFTER Delete
AS
BEGIN
--SET NOCOUNT ON;
declare @cnt int
select @cnt=count(*) from deleted
insert into logs(title) values('deleted '+convert(nvarchar(10),@cnt)+' rows')
END
然后我们用一个测试存储过程来测试插入 内容
Create Proc [dbo].[AddARndStudent]
@names nvarchar(max)
as
begin
--set nocount on
declare @t table(name nvarchar(50))
insert into @t(name)
select item from dbo.[nvarlist_to_tbl](@names,',')
--set nocount off
delete st from students st
inner join @t t on st.name=t.name
insert into students(name)
select item from dbo.[nvarlist_to_tbl](@names,',')
end
执行 sql 查询窗口里执行 exec [AddARndStudent] 'ab,cd'
在执行窗口会显示类似
(2 行受影响)
(1 行受影响)
(2 行受影响)
(1 行受影响)
(2 行受影响)
这显示的是每条子语句及触发器影响的行数,
但是在.net 里执行
SqlCommand.ExecuteNonQuery
会返回 8 ,这是影响的行数之和。
所以有时候,需要用SqlCommand.ExecuteNonQuery的返回值 来判断执行结果的时候,要注意,这个结果可能不是你想要的。为了准确得到你想要的某些条最终影响行数,你可以用 set nocount on 来临时忽略某些语句产生的行影响,然后在需要的时候再用set nocount off 来开启。