在开发过程中,总是遇到一次需要执行多条SQL语句的情况,经常我们会直接把SQL语句拼接在一起,直接一次执行。
但是,在使用SqlCommand.ExecuteNonQuery()经常不注意,它并不会在执行遇到错误时全部回滚。
1 --创建一个成员表 2 CREATE TABLE member 3 ( 4 id INT NOT NULL IDENTITY(1,1), 5 [name] NVARCHAR(20) NULL, 6 age INT NULL, 7 remark NVARCHAR(200) NULL, 8 ) 9 go 10 11 -- 将一下3条语句一起执行 12 INSERT INTO dbo.member(name, age, remark)VALUES(N'张三', 21, N'备注1'); --单独执行,会正确 13 INSERT INTO dbo.member(name, age, remark)VALUES(N'李四', 'x', N'备注2'); --可以看到这条语句中的年龄是错误的数据类型,单独执行,会失败 14 INSERT INTO dbo.member(name, age, remark)VALUES(N'王五', 23, N'备注3');--单独执行,会正确 15 GO 16 17 -- 查询成员表 18 SELECT * FROM dbo.member
先创建表,然后将3条语句一起执行。结果如下:
可以看到,第一条执行成功了;第二条报错了,数据类型不正确;第三条没有执行。
表中的数据如下:
可以看到,只有一条数据。
而在C#中使用SqlCommand.ExecuteNonQuery()一次性执行以上3条插入语句的结果是一致的。
总结:
在C#中使用SqlCommand.ExecuteNonQuery()一次性执行多条SQL语句时,注意使用事务处理。
1、在遇到错误时,不会回滚。
2、在遇到错误时,会终止执行之后的SQL语句。
(以上结论经过C#程序中测试得出的结果!)