当前位置:主页>仓库管理软件> 列表

求助三层数据提交问题!!!!! 找酒店管理软件下载

财务软件版1楼: 我使用adodataset+provider做应用服务器端,在客户端用clientdataset
怎样才能实现服务器端的join多表数据提交 ,看过以前的帖子,好想已经有人解决了,
但是他留下的地址无法打开,谁有比较详细的方法请给我一个好吗 ,新手上路,大家多多帮助
非常感谢!!!!!
wolf_fog@sohu.com

2楼: 1:在中间层的adodataset中建立永久性字段,然后指定每个字段的ProviderFlags属性
或在provider的OnBeforeUpdataRecord事件中控制
2:使用自定义存储过程提交,具体参看:http://www.delphibbs.com/keylife/iblog_show.asp?xid=4771 如记账

3楼: 还是需要手动处理的。多表连接的更新很难实现自动化。即使有自动的办法也很难做到放之四海而皆准。建议你直接在中间层做几个函数,自己处理吧。

4楼: 如果在服务器段写个Save函数,那么多个用户并发调用Save会怎么样呢?

5楼: 把你的多表同时提交改为分步提交

6楼: 关于并发提交的问题,可以通过每一个Save函数打开一个独立的交易并在完成的时候提交或Rollback的方式来解决。

财务软件版7楼: 整个后台程序都是只使用一个connection,在Save时begintrans,结束时commit。这种情况会怎么样呢?

8楼: 后台程序一般是Multi Instance的。所以一般是无法保证只有一个connection的,但是如果在Save的时候begintrans的话,数据库会把你没有commit的表锁起来,下一次对这个表的更新动作会排队。

9楼: 首先
所有要提交的表使用存储过程如
T_XXXAdd @Errs out,......
...
if @@Error<>0 set @Errs=@Errs + 1
...

前台构造一个sql批处理
declare @Errs int
set @Errs=0
BEGIN TRAN
提交主表
EXEC T_MasterAdd @Errs out,....
IF @Errs<>0
Begin
Raisoerror("XXX",16,1)
RollBack Tran
Return
End
提交从表1
EXEC T_Detail1Add @Errs out,....
IF @Errs<>0
Begin
Raisoerror("XXX",16,1)
RollBack Tran
Return
End
......
COMMIT TRAN

10楼: 不好意思,各位大虾,我刚接触这方面的内容,你们的代码我不是很懂.
大家能在详细一点吗?比如说,在哪个控件的哪个事件中应用一些什么样的方法.

TO deadlykiss
你的方法好象是在前台用存储过程实现数据的提交是吗?
TO NineSky
我没看明白你的存储过程是怎么用的
真的不好意思,麻烦大家了.

11楼: 每个数据表操作的存储过程
T_XXXAdd @Errs out,......
是建立在数据库中的。前台只是一个sql批处理(一句嵌套事务处理的sql)
这个批处理是根据实际要提交的数据记录得到的。
你只需要使用一个TAdoquery控件来执行这个批处理(这句sql)就可以了,比如Q_Trans


因为这个sql封装了整个业务,你只需要
Q_Trans.close
Q_Trans.sql=前台生成的sql批处理
Q_Trans.execsql()
就ok了
需要补充的是,你的数据提交业务需要使用客户端缓存技术,这样你就可以根据每个Tadoquery控件当前缓存的数据记录来构造这个sql批处理语句

12楼: 如果这个sql语句太长的话你可以改用TadostorePrv...也就是存储过程的那个控件 如酒店管理软件下载

13楼: ClientDataSet1.ApplyUpdates(0);

财务软件版14楼: 请问 deadlykiss 你说的数据提交业务需要使用客户端缓存技术是什么意思?

15楼: delphi的数据访问组件已经封装好了这个技术 只要设置控件属性就可以了 不象web开发那样复杂 在web开发的时候需要客户端缓存的话需要使用xml或则javascript对象
有关这些知识 网上很多 只要查询一下“客户端 缓存”就可以找到一大堆

16楼: DataSetProvider的UpdateMode设为upWhereKeyOnly,并双击dataset添加所有字段,将key字段的ProviderFlag中的pfInkey设为true
但在ClientDataSet中Refresh方法不会更新,要先将Active设为False,再设为True;

17楼: 多人接受答案了。