SqlCommand.ExecuteNonQuery 的返回值

.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 来开启。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值