我使用此命令在多行中插入多个记录,如果插入不成功,如何锁定命令和回滚更改?
SqlCommand cmd = new SqlCommand();
string s = @"
declare @one_id int;
INSERT INTO tbl_one(o1,o2,o3) VALUES(@o1,@o2,@o3);
set @one_id=SCOPE_IDENTITY();
INSERT INTO tbl_two(t1,t2,f3) VALUES(@t1,@t2,@one_id);
INSERT INTO tbl_two(t1,t2,f3) VALUES(@t3,@t4,@one_id);
INSERT INTO tbl_two(t1,t2,f3) VALUES(@t5,@t6,@one_id);
";
cmd.CommandText =s;
答案 0 :(得分:7)
当然你熟悉try catch语句,所以请使用它。
将您的陈述包含在BEGIN TRANSACTION和COMMIT中,如下所示:
string s = @"
BEGIN TRY
BEGIN TRANSACTION
declare @one_id int;
INSERT INTO tbl_one(o1,o2,o3) VALUES(@o1,@o2,@o3);
set @one_id=SCOPE_IDENTITY();
INSERT INTO tbl_two(t1,t2,f3) VALUES(@t1,@t2,@one_id);
INSERT INTO tbl_two(t1,t2,f3) VALUES(@t3,@t4,@one_id);
INSERT INTO tbl_two(t1,t2,f3) VALUES(@t5,@t6,@one_id);
COMMIT
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK
END CATCH
";
如果您的某个陈述失败,将启动CATCH阻止。
祝你好运。答案 1 :(得分:2)
您可以像Roy建议的那样启动事务并管理SQL代码中的错误,或者您可以在客户端执行此操作:
using (SqlConnection cn = CreateConnection())
using (SqlCommand cmd = CreateMyCommand(cn))
{
cn.Open();
using (SqlTransaction tx = cn.BeginTransaction())
{
cmd.Transaction = tx;
cmd.ExecuteNonQuery();
tx.Commit();
}
}
请注意,此处不需要catch块,因为如果某些内容失败,则事务将在tx.Dispose()上回滚。如果出现故障,则不会调用tx.commit,但由于使用了块,因此总是调用tx.Dispose。如果事先没有提交过,Tx.Dispose会回滚事务。
答案 2 :(得分:1)