父类一方法中有两个数据库操作,并使用到事务,
现在子类准备重写该方法,在父类的方法的基础上加上子类的几个数据库操作,要求是仍旧是原子性的,就是所不管子类中的操作还是父类中的操作出问题全部回滚。
谢谢各位大侠!
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中的操作一起回滚?
我糊涂了!
而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來決定是否是一個事務,這樣,就將事務的決定權放在方法以外了,這樣,無論中方法調用中又調用了多少個方法,都可以完成一個事務.
我的想法倒是,給子類或是基類的方法中傳入一個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
我也是这样想的,这几天也这样去做,我在父类声明了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#时间不太长,有些东西有点糊涂,大家多指导指导!谢谢
在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中的操作一起回滚?
我糊涂了!
而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來決定是否是一個事務,這樣,就將事務的決定權放在方法以外了,這樣,無論中方法調用中又調用了多少個方法,都可以完成一個事務.
我的想法倒是,給子類或是基類的方法中傳入一個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
我也是这样想的,这几天也这样去做,我在父类声明了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#时间不太长,有些东西有点糊涂,大家多指导指导!谢谢
在VC++中我用过,C#中没用过,请你写详细点,谢谢
对了,还有一点,根据我知道的C#中只能继承一个父类,如果要多继承只能采用接口,那我又要继承我说的那个父类,又要继承EnterpriseServices,那我该让哪个作为接口去继承,并重写它的所有方法?还是说让父类继承EnterpriseServices类?
JasonHeung:我想,我正是不想重写父类的方法才问这个问题的,我希望父类多子类而言有些东西是封装掉的.
不好意思我学c#时间不太长,有些东西有点糊涂,大家多指导指导!谢谢
#15
gudengyeren(孤灯夜人)
谢谢你帮我顶!
谢谢你帮我顶!
#16
要不写个接口算了
子类父类各自实现相应的方法
子类父类各自实现相应的方法
#17
ld_thinking:
我希望父类里已经做过的事情子类就不要再重写了.
不过也谢谢你的建议
我希望父类里已经做过的事情子类就不要再重写了.
不过也谢谢你的建议
#18
自己顶一下!
#19
顶一下!
#20
我这里诚心求教,谢谢!帮帮忙!
#21
自己顶
#22
up