--下面是针对第一个问题的示例--测试表
create table A(did int,date datetime,name varchar(10))create table b(id int,gxh int,summary int,[money] money,did int) create table c(id int)
go--触发器
create trigger tr_insert on b
for insert
as
insert c select gxh from inserted where gxh=100
go
--我的问题是如果我的事务在B表已追加了3条记录 
--C表也追加了一条记录时回滚 能否把我所有修改全部回滚掉
begin tran
insert b values(1,1,1,1,1)
insert b values(1,100,1,1,1)  --这条会被增加到C表中
insert b values(1,1,1,1,1) --事务回滚前显示增加的记录的情况
print '事务回滚前显示增加的记录的情况'
print '-------------------------------------'
select * from b
select * from c
rollback tran--事务回滚后显示回滚的处理情况
print '事务回滚后显示回滚的处理情况'
print '-------------------------------------'
select * from b
select * from c
go--删除测试
drop table a,b,c/*--测试结果
事务回滚前显示增加的记录的情况
-------------------------------------
id          gxh         summary     money                 did         
----------- ----------- ----------- --------------------- ----------- 
1           1           1           1.0000                1
1           100         1           1.0000                1
1           1           1           1.0000                1(所影响的行数为 3 行)id          
----------- 
100(所影响的行数为 1 行)事务回滚后显示回滚的处理情况
-------------------------------------
id          gxh         summary     money                 did         
----------- ----------- ----------- --------------------- ----------- (所影响的行数为 0 行)id          
----------- (所影响的行数为 0 行)
--*/

解决方案 »

  1.   

    还有一问在事务中假设A表每追加一条记录B表则随之要追加n条记
    录 但n不确定 这样的事务怎样写
    这个问题就不明白你要做什么了,n总该有什么来决定吧?--一般的写法,在A表写个触发器,实现在A表增加记录时,自动往B表增加记录:
    create trigger tr_insert on A
    for insert
    as
    insert b
    select * from inserted
      

  2.   

    太谢谢了
    我第2问的简单例子就是一张定单 a表是定单信息 B表是定单中发生的记录 由于我们并不能确定一张定单到底会有多少条明细 所以就有了我说的n
    我想过很多办法可实在不知道该如何办 因为总不可能一次把所有的定单明细全部变成参数传到存储过程里去 还有就是由于n 是未知的 该用多少参数呢
    是不是我的思路不对 还请zjcxc(邹建)兄多多指教啊
      

  3.   

    一般对于主从表,是在前台程序中处理的,因为确实不能将明细表的数据一次性传递给存储过程.一般是这样处理的
    on error got lb_err  '有错误时,跳到错误处理部分
    db.begintran  '数据库对象也是有事务处理的(利用数据库处理对象的事务)
    db.execute "插入主表记录的处理"
    db.execute "插入从表(明细表)记录的处理,这里可以用循环重复插入"
    db.committran  '正常处理结束时提交事务
    return         '返回lb_err:
    db.rollback tran
    msgbox "错误:" & error()