关于MIDAS实现Master/Detail应用有两个难解 的问题请教

Muf 2001-05-29 09:19:00
1. 一个Master表,带一个以上的Detail表,
使用TADODataset/TADOTable,并通过DataSource建立主关键字关连。
同时在每个表中设置每个字段的ProviderFlags属性(中InKey,InWhere,InUpdate),
然后通过TDataSetProvider传递给客户。
客户程序使用SocketConntion连拉,数据表采用TClientDataSet获取Provider传回来的数据,
建立相应的TClientDataSet通过DataSetField,采用NestedTable形式与主TClientDataSet关联。
--> 问题:
TDatasetProvider设置为:ResolveToDataSet=True, UpdateMode=WhereKeyOnly,此时,
主表和子表均可以增加和删除数据,主表可以修改数据,
但子表不能修改数据,如修改,则提交后将出现"Record Changed by Anthoer"错误。
TDataSetProvider设置为:ResolveToDataSet=False,UpdateMode=WhereKeyOnly,此时:
主表和子表均可以删除和修改数据,主表可以增加数据,
但子表不能增加数据,如增加,则提交后将出现"主关键字段不能为NULL"错 误。
请问,为何会有这么大的分别?如果要解决问题,是否只能使用ResolveToDataSet=False,
并且在客户或服务端自行设置和主表关联的关键字段的值,使用不为NULL?
这样一来,Delphi的Master/Detail结构的发处就体现不出来,而且代码量也挺大的
(要保证Master/Detail关键字一致不太容易。)
----->请关注。

2 此系统采用MTS,Delphi已安装UpdataePacked#1, ADO UP#1 ADO UP#2
MTS Module 在没安装 Updatapack之前,只能采用"不支持事务"模式,
安装上述UpdataPack以后,可采用"支持事务"模式,
但"需要事务"和"需要新事务"均不能用,一用,提交事务将出现"不能启动事务(类似)"的错误信息。
数据集采用TADODataSet/TADOTable,然道MIDAS应用在MTS中还仍要自行管理事务吗?
(曾有人提示按李维修改的Provider.pas文件做,但无效。原因是TADODataset处理事务已经有识别是否在MTS中了)

运行和开发环境:Delphi5+ADO2.5+SQL7.0+Windows2000Server
升级包:SQL7Update#2, Delphi5 Update#1 ADOExpress UP#1,Up#2

我现有可用分712参与分1076,为什么只能给73分?
分数以后我会再加。主要是和大家一起探讨问题。谢谢大家。
...全文
756 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
lukejee 2001-06-03
  • 打赏
  • 举报
回复
我上次也研究了一下TADODataSet作Master/Detail,而且结合COM+事务处理,也没有作这么多设定,就可以了,子表和主表都可以增加、修改记录,而且COM+的事务处理也成功了,还打开了Object Pooling,也许是我运气不错。我建议你换一个数据库再测试一下,我用的是SQL Server 2000里的Northwind,祝你好运。
lukejee 2001-06-03
  • 打赏
  • 举报
回复
火鸟33 2001-06-02
  • 打赏
  • 举报
回复
Muf 2001-06-02
  • 打赏
  • 举报
回复
但我用的是关键字更新,关键字并没有默认字段(也没有意义),也没使用自动增量。
lzzqqq 2001-06-01
  • 打赏
  • 举报
回复
不知道是否是默认值字段惹的祸,就好比你对一个表增加一条记录,但其中一个字段你没赋值,而这个字段的值是数据库通过默认值的方式赋进去的(比如这个值是0),那么midas将无法确定这个字段值的来历并且在更新客户端数据集时产生与实际的后台数据库中数据的不一致,于是错误就发生了,midas此时也禁止对后台数据库的更新。我想你还是看一下李维的书吧,因为有过同感,不过后来还是解决了,就是造成不要用默认值字段,希望以上的建议对你有所帮助。
lzzqqq 2001-06-01
  • 打赏
  • 举报
回复
用midas开发时也遇到过"recorordcount changed by another user"之类的信息,原因是数据库中用了有默认值的字段,将所有默认值去掉就好了,希望你看一下李维的多层数据库编程中的数据更新原理,你就清楚了。
liming_zh 2001-06-01
  • 打赏
  • 举报
回复
gz
Muf 2001-06-01
  • 打赏
  • 举报
回复
To comanche(太可怕)
我用MTS从来不用DCOMConnection方式连接,总是用SocketConn,你为什么这么认为?
Muf 2001-06-01
  • 打赏
  • 举报
回复
结账时间要推迟了。

难道是我的错?看了zkp的贴子,我得再试几次了。
我除了是用SQL7,其它条件和zkp一模一样,可是就出现"在一个会话中不能启动多个事务"的错误。
zkp 2001-06-01
  • 打赏
  • 举报
回复
1.我的系统也采用com+与Midas,TDatasetProvider设置为:ResolveToDataSet=False,
UpdateMode=WhereKeyOnly,子表要自己保证Master/Detail关键字一致,我采用AutoNum为主子表关联字段,实现很简单。
2.支持事务"模式,"需要事务"能用。环境为:Delphi5+ADO+SQL2000+Windows2000Server
升级包:Delphi5 Update#1 ADOExpress UP#1,Up#2

Muf 2001-05-31
  • 打赏
  • 举报
回复
还有高见的没有?
xang2001 2001-05-31
  • 打赏
  • 举报
回复
COM+中可以不用DCOM联接,直接Create,然后直接用DateSetProvider提交Delta
Master/Detail可以不用作任何联接,自已用ADOQuery从DATABASE SERVER取两个表对应的数据
只是一次只能一笔不过很快。
Muf 2001-05-31
  • 打赏
  • 举报
回复
儿童节来结账。
Muf 2001-05-31
  • 打赏
  • 举报
回复
儿童节来结账。
还有高见吗?建设性的答案给高分。
comanche 2001-05-31
  • 打赏
  • 举报
回复
. 我对 CommandText的看法跟你的一样,严格限其使用,CommandText可能是破坏三层结构的最大隐患。

. 我从不用 MTS对像开发,我喜欢亲自管理事务,不知你有没同感。MTS连接方式必须是 DCOM,我不喜欢。MTS怎么作对像 pooling的?不知道的东西我都有带怀疑。MTS实际上并不能有大量用户连接,我见到过这种事发生....

. 问题解决了就好了, 请关注http://www.csdn.net/expert/topic/134/134381.shtm nononono的问题, 作MIDAS的人在 csdn上不知是不是很少,还是太忙, 这种贴很少有人回应.
xlzps 2001-05-30
  • 打赏
  • 举报
回复
噢,还有一点提醒一下,在服务器端建立主从关系,最好不要用ADODataSet,用ADOQuery代替它好些,因为现在ADODataSet好像还有许多Bug,不是很成熟,我在用它的时候也碰到许多问题,把它换为ADOQuery后,一切正常!!
xlzps 2001-05-30
  • 打赏
  • 举报
回复
to Muf(沐枫) 我前段时间刚做完成一个项目,采用的技术和开发平台跟的一样,没有出现过你所说的问题。其实你可以先这样试试:主从关系当然是在服务器端建立好,但DataSetProvider的设置可以完全按照它的缺省的值(当然要是客户端有查询的话:poAllowCommandText:=True),这样客户端也只要主表提交就行了(子表会自动提交),它会自动执行事务的。若这样做不会出现问题的话,再慢慢改变一些属性,看看问题出在哪,也可以慢慢做些性能上的调节。这样是不是比较好些,我们做的那个系统现在运行很挺稳定的,速度方面,只要不一次将一个大表的记录传到客户端,一般都还可以!!
comanche 2001-05-30
  • 打赏
  • 举报
回复
子表一定要 upWhereAll的, 除非你子表中也存在 Key,要不然是不能定位到一条记录的
comanche 2001-05-30
  • 打赏
  • 举报
回复
不解了,你可能放上些代码和数据让大家看看
Muf 2001-05-30
  • 打赏
  • 举报
回复
欢迎继续讨论。
加载更多回复(11)

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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