C#的问题关于数据库操作和类的继承、重写

时间:2022-05-26 09:20:09
目前我有如下问题
父类一方法中有两个数据库操作,并使用到事务,
现在子类准备重写该方法,在父类的方法的基础上加上子类的几个数据库操作,要求是仍旧是原子性的,就是所不管子类中的操作还是父类中的操作出问题全部回滚。


                                                  谢谢各位大侠!

22 个解决方案

#1


使用事务了就应该没有问题,楼主到底担心什么?

#2


GZ+JF

#3


up

#4


收藏。

#5


是这样的,很多人告诉我connection是非常耗服务器资源的,所以sqlconnection我都是随用随new的
而SqlTransaction对象需要从sqlconnection的BeginTransaction获得,所以父类的方法SAVE里我已经是这样的代码了:
Con=new SqlConnection(ConStr);
Con.Open();
Trans=Con.BeginTransaction();…………
Trans.Commit();…………
Trans.Rollback();…………
Con.Close();
到了子类的Save方法中,我希望先base.Save()然后执行子类的数据库操作,子类的操作失败后连父类Save中的操作也回滚掉
可是Con在base.Save中是要Open的,势必我在子类中要用另一个SqlConnection,这样产生的事务,能不能连base.Save中的操作一起回滚?
我糊涂了!

#6


不行

#7


重写时要包含父类操作,但不再调用父类方法。

#8


JasonHeung请讲具体点,谢谢!

#9


怎么没人回答我啊?这里可是CSDN啊!

#10


我猜JasonHeung的意思就是子類的方法覆蓋基類的方法,這樣就可以做到不執行基類的方法,只執行子類的方法,以達到在一個方法中完成交易的目的.
我的想法倒是,給子類或是基類的方法中傳入一個Trans,方法中跟據傳入的Trans來決定是否是一個事務,這樣,就將事務的決定權放在方法以外了,這樣,無論中方法調用中又調用了多少個方法,都可以完成一個事務.

#11


建议你继承EnterpriseServices,通过COM+组件服务来实现自动事务管理。

#12


weiljj
我也是这样想的,这几天也这样去做,我在父类声明了protected SqlTransaction Trans;
然后父类的方法中判断Trans是否begin过:
if(Trans==null)//如果事务为空
{
Trans=Con.BeginTransaction(IsolationLevel.Serializable,"UserBase");//begin事务
bIsChildTrans=false;//事务不是子事务
}
else
{
Trans.Save("UserBase");//设一保存点
bIsChildTrans=true;//事务是子事务
}
在递交的时候:
if (!bIsChildTrans)//是否是子事务,子事务就不递交了
Trans.Commit();
在回滚的时候:
if ( Trans != null)//回滚到保存点
Trans.Rollback("UserBase");
可是现在问题是第一次单独用父类的方法的时候Trans是null,第二次再用这个方法Trans就不是null了,怎么办?
有没有办法让Trans变会null

#13


#14


lzualx:在C#中怎么用Com+组件服务的?
在VC++中我用过,C#中没用过,请你写详细点,谢谢
对了,还有一点,根据我知道的C#中只能继承一个父类,如果要多继承只能采用接口,那我又要继承我说的那个父类,又要继承EnterpriseServices,那我该让哪个作为接口去继承,并重写它的所有方法?还是说让父类继承EnterpriseServices类?

JasonHeung:我想,我正是不想重写父类的方法才问这个问题的,我希望父类多子类而言有些东西是封装掉的.

不好意思我学c#时间不太长,有些东西有点糊涂,大家多指导指导!谢谢

#15


gudengyeren(孤灯夜人) 
谢谢你帮我顶!

#16


要不写个接口算了  
子类父类各自实现相应的方法

#17


ld_thinking:
我希望父类里已经做过的事情子类就不要再重写了.
不过也谢谢你的建议

#18


自己顶一下!

#19


顶一下!

#20


我这里诚心求教,谢谢!帮帮忙!

#21


自己顶

#22


up

#1


使用事务了就应该没有问题,楼主到底担心什么?

#2


GZ+JF

#3


up

#4


收藏。

#5


是这样的,很多人告诉我connection是非常耗服务器资源的,所以sqlconnection我都是随用随new的
而SqlTransaction对象需要从sqlconnection的BeginTransaction获得,所以父类的方法SAVE里我已经是这样的代码了:
Con=new SqlConnection(ConStr);
Con.Open();
Trans=Con.BeginTransaction();…………
Trans.Commit();…………
Trans.Rollback();…………
Con.Close();
到了子类的Save方法中,我希望先base.Save()然后执行子类的数据库操作,子类的操作失败后连父类Save中的操作也回滚掉
可是Con在base.Save中是要Open的,势必我在子类中要用另一个SqlConnection,这样产生的事务,能不能连base.Save中的操作一起回滚?
我糊涂了!

#6


不行

#7


重写时要包含父类操作,但不再调用父类方法。

#8


JasonHeung请讲具体点,谢谢!

#9


怎么没人回答我啊?这里可是CSDN啊!

#10


我猜JasonHeung的意思就是子類的方法覆蓋基類的方法,這樣就可以做到不執行基類的方法,只執行子類的方法,以達到在一個方法中完成交易的目的.
我的想法倒是,給子類或是基類的方法中傳入一個Trans,方法中跟據傳入的Trans來決定是否是一個事務,這樣,就將事務的決定權放在方法以外了,這樣,無論中方法調用中又調用了多少個方法,都可以完成一個事務.

#11


建议你继承EnterpriseServices,通过COM+组件服务来实现自动事务管理。

#12


weiljj
我也是这样想的,这几天也这样去做,我在父类声明了protected SqlTransaction Trans;
然后父类的方法中判断Trans是否begin过:
if(Trans==null)//如果事务为空
{
Trans=Con.BeginTransaction(IsolationLevel.Serializable,"UserBase");//begin事务
bIsChildTrans=false;//事务不是子事务
}
else
{
Trans.Save("UserBase");//设一保存点
bIsChildTrans=true;//事务是子事务
}
在递交的时候:
if (!bIsChildTrans)//是否是子事务,子事务就不递交了
Trans.Commit();
在回滚的时候:
if ( Trans != null)//回滚到保存点
Trans.Rollback("UserBase");
可是现在问题是第一次单独用父类的方法的时候Trans是null,第二次再用这个方法Trans就不是null了,怎么办?
有没有办法让Trans变会null

#13


#14


lzualx:在C#中怎么用Com+组件服务的?
在VC++中我用过,C#中没用过,请你写详细点,谢谢
对了,还有一点,根据我知道的C#中只能继承一个父类,如果要多继承只能采用接口,那我又要继承我说的那个父类,又要继承EnterpriseServices,那我该让哪个作为接口去继承,并重写它的所有方法?还是说让父类继承EnterpriseServices类?

JasonHeung:我想,我正是不想重写父类的方法才问这个问题的,我希望父类多子类而言有些东西是封装掉的.

不好意思我学c#时间不太长,有些东西有点糊涂,大家多指导指导!谢谢

#15


gudengyeren(孤灯夜人) 
谢谢你帮我顶!

#16


要不写个接口算了  
子类父类各自实现相应的方法

#17


ld_thinking:
我希望父类里已经做过的事情子类就不要再重写了.
不过也谢谢你的建议

#18


自己顶一下!

#19


顶一下!

#20


我这里诚心求教,谢谢!帮帮忙!

#21


自己顶

#22


up