你可以这样做,给Add方法加一个参数Add(SqlTransaction transaction)
Add方法中的SqlConnection以如下方法获得。
SqlConnection connection=transaction.Connection你可以看一下Microsoft.ApplicationBlocks.Data,它就是这样通过事务操作数据的。

解决方案 »

  1.   

    你可以这样做,给Add方法加一个参数Add(SqlTransaction transaction)
    Add方法中的SqlConnection以如下方法获得。
    SqlConnection connection=transaction.Connection你可以看一下Microsoft.ApplicationBlocks.Data,它就是这样通过事务操作数据的。
      

  2.   

    还有没有其它的办法呀!我不想用这种方法,也不想用COM+。最后如果不行只有用这个方法了,希望各位在想想办法。我在等一天,明天结帖。
      

  3.   

    不太明白为什么楼主不想采纳 CMIC(大象)的方法,很标准的方法呀这是
    还有,我提个建议
    其实那类A和B来说,并没有形成一个业务实体
    建议用一个类C来描述这个实体
    C中包括
    private A a;//表头信息
    private arrayList bList;//详细信息列表比如说方法
    Add()
    {
       //开始事务
       调用a.Add(事务参数);
       foreach(B b in bList)
       {
         b.Add(事务参数);
       }
       //提交事务
    }
      

  4.   

    TO: brightheroes(闭关)
      B类继承A后,B拥有A的全部属性,这样我就可以将B绑定到控件上了。
      比如电梯是父类A,客用电梯是子类B,B类中有很多属性是A类的属性。这样B类就可以少做很多事了。
      所以B类里的属性+A类里的属性=B业务实体
      

  5.   

    面向对象开发中的事务问题,真是一个不好处理的问题,要是把一个事务对象传来传去的,不是一个好的办法,又要保证类的特性,实在不行的话不把这个ADD方法做成一个在子类中重写的,让子类自己来处理这个动作.
      

  6.   

    我明白你的意思了,ok
    可以如下来做,如果一定要用类B来继承A,而不是用另外一个类C来包装没有继承关系的A和B的话(我还是推荐这种做法)
    --声明,以下的方法比较诡异,但是的确是一个方法;你可以在A中做一个方法,这个方法就是Add
    然后在Add方法里面通过反射来作,当然这样就略显无奈。
    比如说你的类B中,有一个属性,叫做InsertSql,返回insert字符串(这个没有问题吧,甚至你这个Sql语句都可以生成,但是我们先简单的就事论事)
    Add()
    {
        Type t = this.GetType();//通过这句话可以得到当前的类型
        if(t.ToString() == "xxxx.xxxx.B")//xxxx表示你的命名空间
        {
            string sql = t.GetProperty("InsertSql").GetValue(null,null);
        }
            
    }大概是这么个意思,这是一个思路调用的时候因为你的B继承了A,所以B中也有了Add这个方法B.Add()
    就可以了不知道你有没有明白,大概我说的不是很清楚总之,在执行B.Add()的时候
    Type t = this.GetType()得到是B
      

  7.   

    我觉得,类B和A不应该是父子关系,他们反映在数据库中是主从表,反映在C#里面是两个平等的类,应该用另外的一个类C来描述他们的关系。
      

  8.   

    换句话来说
    “A和B是形成一个业务实体”
    这句话我不赞同
    类B继承了A,表示B是A的一个更详细的说明,并没有和A构成一个业务实体
    更严格的说一点,有了B,就无需有A了
    所以插入数据的时候没有必要用事务来包含A(当然B内部可以用自己的事务)
      

  9.   

    你可以在类A中定义一个属性SqlString
    然后在A的Add里面调用这个属性就可以了
     
      

  10.   

    To brightheroes(闭关) :能不能给一个具体一点的例子
    Add()
    {
       //开始事务
       调用a.Add(事务参数);
       foreach(B b in bList)
       {
         b.Add(事务参数);
       }
       //提交事务
    }
      

  11.   

    我明白了brightheroes(闭关)的意思了。不过现在这个项目已经开始,没有时间试了,我还是采用最笨的方法吧。
    另外如果有个类C继承B,那么你在A类中的判断if(t.ToString() == "xxxx.xxxx.B")好像就不成立了。
    你从B的角度看他是一个完整的电梯对象,但它也是一个设备不是吗,所以他有父类设备(A)的全部属性。
    希望继续回帖