面向对象开发中的事务问题。非常之急。

WindowsBoy 2004-04-20 04:10:14
在论坛中找了一下,但没有找到,请各位来解决一下。
  在面向对象的程序设计中一两个类A和B,A是父类,B是A的子类,A和B都有一个Add方法用来向数据库中的两个表(A和B表)添加记录。在B类的Add方法中调用Base.Add("参数列表")然后在调用数据访问层的方法向B表插入数据。因为A和B是形成一个业务实体所以必需做事务的处理。
  不使用COM+和传connection参数的方法。
  不知道我说明白了没有。100分不够就在加100分。
...全文
231 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
WindowsBoy 2004-04-23
  • 打赏
  • 举报
回复
我明白了brightheroes(闭关)的意思了。不过现在这个项目已经开始,没有时间试了,我还是采用最笨的方法吧。
另外如果有个类C继承B,那么你在A类中的判断if(t.ToString() == "xxxx.xxxx.B")好像就不成立了。
你从B的角度看他是一个完整的电梯对象,但它也是一个设备不是吗,所以他有父类设备(A)的全部属性。
希望继续回帖
WindowsBoy 2004-04-22
  • 打赏
  • 举报
回复
TO: brightheroes(闭关)
  B类继承A后,B拥有A的全部属性,这样我就可以将B绑定到控件上了。
  比如电梯是父类A,客用电梯是子类B,B类中有很多属性是A类的属性。这样B类就可以少做很多事了。
  所以B类里的属性+A类里的属性=B业务实体
changezhong 2004-04-22
  • 打赏
  • 举报
回复
To brightheroes(闭关) :能不能给一个具体一点的例子
Add()
{
//开始事务
调用a.Add(事务参数);
foreach(B b in bList)
{
b.Add(事务参数);
}
//提交事务
}
brightheroes 2004-04-22
  • 打赏
  • 举报
回复
你可以在类A中定义一个属性SqlString
然后在A的Add里面调用这个属性就可以了

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


brightheroes 2004-04-22
  • 打赏
  • 举报
回复
我觉得,类B和A不应该是父子关系,他们反映在数据库中是主从表,反映在C#里面是两个平等的类,应该用另外的一个类C来描述他们的关系。
brightheroes 2004-04-22
  • 打赏
  • 举报
回复
我明白你的意思了,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

北京的雾霾天 2004-04-22
  • 打赏
  • 举报
回复
面向对象开发中的事务问题,真是一个不好处理的问题,要是把一个事务对象传来传去的,不是一个好的办法,又要保证类的特性,实在不行的话不把这个ADD方法做成一个在子类中重写的,让子类自己来处理这个动作.
生活真美好 2004-04-21
  • 打赏
  • 举报
回复
gz
WindowsBoy 2004-04-21
  • 打赏
  • 举报
回复
还有没有其它的办法呀!我不想用这种方法,也不想用COM+。最后如果不行只有用这个方法了,希望各位在想想办法。我在等一天,明天结帖。
CMIC 2004-04-21
  • 打赏
  • 举报
回复
你可以这样做,给Add方法加一个参数Add(SqlTransaction transaction)
Add方法中的SqlConnection以如下方法获得。
SqlConnection connection=transaction.Connection

你可以看一下Microsoft.ApplicationBlocks.Data,它就是这样通过事务操作数据的。
CMIC 2004-04-21
  • 打赏
  • 举报
回复
你可以这样做,给Add方法加一个参数Add(SqlTransaction transaction)
Add方法中的SqlConnection以如下方法获得。
SqlConnection connection=transaction.Connection

你可以看一下Microsoft.ApplicationBlocks.Data,它就是这样通过事务操作数据的。
WindowsBoy 2004-04-21
  • 打赏
  • 举报
回复
在UP
brightheroes 2004-04-21
  • 打赏
  • 举报
回复
不太明白为什么楼主不想采纳 CMIC(大象)的方法,很标准的方法呀这是
还有,我提个建议
其实那类A和B来说,并没有形成一个业务实体
建议用一个类C来描述这个实体
C中包括
private A a;//表头信息
private arrayList bList;//详细信息列表

比如说方法
Add()
{
//开始事务
调用a.Add(事务参数);
foreach(B b in bList)
{
b.Add(事务参数);
}
//提交事务
}
WindowsBoy 2004-04-21
  • 打赏
  • 举报
回复
自己在UP一下
WindowsBoy 2004-04-20
  • 打赏
  • 举报
回复
是的。而这两次不是事先知道的。因为随着系统的扩展,其子类也可能在增加。所以也不一定是两次数据访问,可能更多。
北京的雾霾天 2004-04-20
  • 打赏
  • 举报
回复
你的情况是用到了两次数据访问层的函数,这次操作还必需是在一个事务里面是吧?
WindowsBoy 2004-04-20
  • 打赏
  • 举报
回复
自己UP一下
Hexudong1979 2004-04-20
  • 打赏
  • 举报
回复
up
rock框架是本人开发的一个开源框架。 rock框架的核心主要是rock-dbutils,rock-dbutils是一个轻量级的ORM框架,对jdbc进行了浅层次的封装。是本人在教学和项目开发慢慢积累开发而成,用来代替烦人的复杂的hibernate的。使用rock框架开发应用非常简单,可以和spring整合开发。 rock框架特点: 1 不需要编写表映射xml文件 2 支持ID自动生成 3 推荐使用qbc方式编程,不需要编写sql。 4 不支持HQL之类的查询语言,对于复杂查询任务,直接使用sql语言,操作简单,可直接返回对象数据。 5 对于复杂查询任务,sql语句也可以直接放在spring的配置文件,直接注入到DAO。 6 不支持对象之间的关联。 7 不支持缓存(觉得没必要) 8 利用数据库本身功能支持数据分页 9 使用数据库方言支持不同的数据库 10 暂不支持aop事务 11 即使是最纯粹的sql编程,也是1行代码的事 使用hibernate很烦人的地方最主要有两点: 1 不使用sql,搞个hql。其实程序员还是写sql舒服。 2 为了面向对象面向对象,搞得太复杂,效率又低,面向对象的好处都被其副作用抵消了。 所以,基于以上两点,rock框架采取的是半面向对象半关系封装方式。要么不写sql,要么写就写最纯正的sql。 如果大家感兴趣,就下载试用一下下,里面有源代码、文档、例子。如果有什么意见尽管提。 就是本人平常自己写自己用的小玩意,今天高兴拿出来共享,别上升到国人开发什么什么的高度,谁要是这么捧杀我或棒杀我,我跟谁急。 联系我:mex2000@163.com 梦湘工作室 王昆山

111,096

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧