数据集(TClientData)与数据提供者(TDataSetProvider)的问题(100分)

  • 主题发起人 主题发起人 Afei1
  • 开始时间 开始时间
A

Afei1

Unregistered / Unconfirmed
GUEST, unregistred user!
我在开发三层的时候碰到这样的问题。
如果客户端的多个(TClientData)共用服务端的一个(TDataSetProvider),而且同时运行,
或者一个界面同时被多个用户调用,则不管是保存还是添加还是修改都会出现不可欲知的
错误,请问各位老大这个问题要怎么解决?
 
如果你是共用一个CLientdataset,而且有一些永久字段就比较麻烦
建议在应用服务器的增加一些过程在Type Library 里面增加
然后在客户端用以下方式调用:
SocketConnection1.Appserver.应用服务器过程名
这种方面比较方便,考虑下吧
 
to delphilove,能不能说详细点
我把我的问题也说详细点:
数据库:SQLServer2000
远程数据模块:ServerRMD(TADOConnection + TDataSetProvider)
本地数据模块:ClientDM (TDCOMConnection连接服务端)
用户界面:TClientData连接本地数据模块的TDCOMConnection组件,
然后ProviderName的属性就是远程数据模块的TDataSetProvider组件

现在的问题是远程数据模块TDataSetProvider组件要怎么被共用的问题
 
给你个我写的文章:
在数据库应用系统中,常会用到存储过程,触发器等方法,但在三层次下,使用这些方法
更新数据无法及时反馈回客户端,这时需要使用应用程序服务器(Application)的自定义
方法刷新数据。
具体使用方法如下:
1. 应用程序服务器端
a) 调用Type Library窗口 ;
b) 在Interface部分新添一个方法(method),命名为: mDataRefresh ;
c) 为该方法添加一个参数,名称为: ADataSetName ,类型为:BSTR ,
Modifier为:[in] ,返回类型为:HRESULT ;
d) 保存该工程 ;
e) Delphi会自动生成该方法的声明和实现代码的框架,在实现部分写如下代码:
procedure TServerFunction.mDataRefresh(const ADataSetName: WideString);
var
ADODataSet: TADODataSet;
bState: Boolean;
Begin
ADODataSet := TADODataSet(FindComponent(ADataSetName));
If ADODataSet=nil then
Begin
Raise Exception.Create(ADataSetName + ' not EXISTS! ');
Exit;
End;
bState := ADODataSet.Active;
If not ADODataSet.Active then
ADODataSet.Open;
ADODataSet.Requery;
ADODataSet.Active := bState;
End;
f) 保存工程并编译 。
2. 客户端
a) 在客户端需要更新数据的地方(比如:数据集的Refresh事件里等)调用在第
一步中创建的方法 ;
b) 具体代码如下:
SocketConnection1.AppServer.mDataRefresh(你的中间层数据集名称);
客户端数据集(单档或主档).Refresh;
注意:无论是单档还是主细档甚至是多层的主细档结构都可以对其中任一部分刷新,
在三层次中巢状表结构的数据集,使用主档ReQuery的同时不能更新细档,
细档要单独更新。

经过以上两个步骤,就可以在三层次下的客户端及时更新数据了。
 
to tomol
先谢谢你了,看你的文章,我好象有点思路,但现在还不能立即想出具体的解决办法
等一下看还有没有别人的,如果没有就给你加分了
 
多人接受答案了。
 
后退
顶部