我在SqlServer中有两个表“EnrolledSubjects”和“StudentAccounts”。显然,登记的科目应该转到前者,而他们的费用应该转到后者。我对两个表使用简单的Insert语句,但问题是,如何确保当其中一个表在插入时失败时,另一个表也不能插入任何内容。我可以像这样使用try-catch:
try
{
insert statement to EnrolledSubjects table;
insert statement to StudentAccounts table;
} catch(Exception ex) {
get the error here
}
但是,如果插入到EnrolledSubjects时没有错误,但插入StudentAccounts时出错?那意味着我需要删除插入到EnrolledSubjects表中的任何内容 您能告诉我如何根据我的规范实现这一权利。恩。你。
答案 0 :(得分:4)
正如@TimBiegeleisen在评论中提到的那样,您需要TransactionScope:
try
{
using (var scope = new TransactionScope())
{
// insert statement to EnrolledSubjects table;
// insert statement to StudentAccounts table;
scope.Complete(); // don't forget this!
}
}
catch(Exception ex)
{
// get error here
}
如果尚未调用scope.Complete()
,则事务将回滚。如果您的项目尚未提供System.Transactions
,则需要添加对NSString *imgUrl1 = @"http://i.stack.imgur.com/SWblQ.png";
NSString *imgUrl2 = @"http://i.stack.imgur.com/fcdTa.png";
UIButton *btn = [[UIButton alloc]initWithFrame:CGRectMake(0, 0,100, 100)];
btn.center = self.view.center;
[btn sd_setBackgroundImageWithURL:[NSURL URLWithString:imgUrl1] forState:UIControlStateNormal];
[btn sd_setBackgroundImageWithURL:[NSURL URLWithString:imgUrl2] forState:UIControlStateSelected];
[btn addTarget:self action:@selector(btnSelect:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn];
- (void)btnSelect:(UIButton *)select{
select.selected = !select.selected;
}
的引用。
答案 1 :(得分:0)
首先检查第一个插入语句是否成功插入 如果它成功,那么如果第二个插入则进行另一次插入 也成功插入,而不是为两者提交。
如果他们提出错误而不是回滚交易。