各位在作三层时也有可能会遇到的问题,(进来看看再说吧)。(177分)

  • 主题发起人 主题发起人 free_knight
  • 开始时间 开始时间
F

free_knight

Unregistered / Unconfirmed
GUEST, unregistred user!
作一个简单的三层程序时遇到这样一个问题:
应用程序服务器上有两个TDataSetProvider
DataSetProvider1用来修改,DataSetProvider2用来查询
客户端使用多文档窗口,
对表操作的每个form上都有一个ClientDataset连接DataSetProvider1
这样一来就有问题了,打开form1,再打开form2时DataSetProvider1就被form2的ClientDataSet
占用了,这时再切换到form1时ClientDataSet.ApplyUpdate()就不起作用了,
后来在Form.onActiave事件中重新把DataSetProvider1给form1使用,
但这样如果form2上修改的没有保存就会被冲掉。
后来看见有个方法是动态创建TDataSetProvider

如何才能让client使用appserver动态创建的TDataSetProvider (200分)
分类:数据库-C/S型 gulfstream (2000-11-15 12:23:00)
AppServer在运行时动态创建一个DataSetProvider,如何才能让该DataSetProvider
能够被client使用?

jqw (2000-11-15 12:58:00)
server端创建dataset datasetprovider
client端创建clientdataset,其provider指向datasetprovider

DreamTiger (2000-11-15 13:11:00)
动态创建,可以从AppServer查询到有哪些DataSetProvider么?
我觉得比较困难

gulfstream (2000-11-15 16:26:00)
d5的midas 3中,tclientdataset不再维护IProvider接口,没有了provider属性,代之以
providername属性,但是clientdatase没法看见appserver中动态创建的datasetprovider,
有没有什么办法可以动态创建datasetprovider供client使用?

gulfstream (2000-11-17 15:12:00)
我已将问题解决,现已可以使用动态创建的tdatasetprovider
版主能否将此问题取消?

DreamTiger (2000-11-17 15:34:00)
不要忙着取回分数么,既然你已经知道怎么做了,不如把
你的解决方法告诉大家,让大家分享你的快乐。这个问题
也算有个圆满结束。如果你需要分数,我可以另开一个问
题给你分数。这题分数就给jqw 了。希望能够看到你的解
决方法。

gulfstream (2000-11-18 10:13:00)
其实很简单,使用 RemoteDataModule.RegisterProvider注册DataSetProvider,
但要注意设置TDataSetProvider.Name,当时我就是忘了设置该值,所以client
看不见动态创建的TDataSetProvider。
that's all
:PP

我想问一下各位是不是有更好的方法,如果没有是不是能把上面的解决方法具体化一下。
 
》》对表操作的每个form上都有一个ClientDataset连接DataSetProvider1
不用数据模块吗?
 
这属于线程冲突。
 
jrq:
如果放在数据模块上也同样不能解决问题,而且如果有DBGrid的话,切换一下后就
什么都没了

完颜康,李衍智: 怎么解决

 
又看了一边你的问题,
你可以在程序中用代码动态的指定ClientDataSet的ProviderName属性啊~
翻了一下我以前的一个程序(MySQL的),
是用一个ClientDataSet链接了六七个DataSetProvider,根据条件判断该用那个!
看看对你是否有所帮助!
------------------------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
begin
mySQL_DM.ClientDataSet.Close;
if ComboBox1.Text='' then
exit;
if ComboBox1.Text='lib' then
mySQL_DM.ClientDataSet.ProviderName:='lib_DataSetProvider';
if ComboBox1.Text='libdir' then
mySQL_DM.ClientDataSet.ProviderName:='libdir_DataSetProvider';
if ComboBox1.Text='libindex' then
mySQL_DM.ClientDataSet.ProviderName:='libindex_DataSetProvider';
if ComboBox1.Text='libmedia' then
mySQL_DM.ClientDataSet.ProviderName:='libmedia_DataSetProvider';
if ComboBox1.Text='libpic' then
mySQL_DM.ClientDataSet.ProviderName:='libpic_DataSetProvider';
if ComboBox1.Text='user' then
mySQL_DM.ClientDataSet.ProviderName:='user_DataSetProvider';

if ComboBox1.Text='lw_info' then
mySQL_DM.ClientDataSet.ProviderName:='lw_info_DataSetProvider';
if ComboBox1.Text='lw_type' then
mySQL_DM.ClientDataSet.ProviderName:='lw_type_DataSetProvider';
with mySQL_DM.ClientDataSetdo
begin
Close;
CommandText:='select * from ' +ComboBox1.Text;
try
Open;
except
ShowMessage('XXXXXXXXXXXXXXXXXX');
end;
end;
end;
 
jrq:
你的方法我明白了,可是如果有很多张表呢。可能大于30张呢,不会用30个
DataSetProvider吧
 
那我问:
你在应用程序服务器上的两个TDataSetProvider是连的什么控件? ADOQuery?
-----------
>如何才能让client使用appserver动态创建的TDataSetProvider (200分)
>AppServer在运行时动态创建一个DataSetProvider,如何才能让该DataSetProvider
>能够被client使用?
>其实很简单,使用 RemoteDataModule.RegisterProvider注册DataSetProvider,
>但要注意设置TDataSetProvider.Name,当时我就是忘了设置该值,所以client
>看不见动态创建的TDataSetProvider。
我正在读这个答案~
我没有这样做过,且去试试!
在如何客户端能动态的改变AppServer???
假如成功了,你的问题也就解决了吧~ [:D]
 
jrq,
应用程序服务器上的两个TDataSetProvider是连的是DataSet
至于下面这个问题
gulfstream (2000-11-18 10:13:00)
其实很简单,使用 RemoteDataModule.RegisterProvider注册DataSetProvider,
但要注意设置TDataSetProvider.Name,当时我就是忘了设置该值,所以client
看不见动态创建的TDataSetProvider。
我没有成功,各位有谁试成功了告知一声。
 
做3层的时候,如果长期的要进行数据库的连接(例如DBGrid这类),我觉得就不是真正
发挥三层的作用,只是简单的C/S的模式的模仿罢了。。。
其实你也可以通过动态创建TClientDataSet,成为DBGrid等的数据库源。。但是一定不要
成为长期数据连接的方式。。
 
我试过,最稳定的方法是每个TClientDataSet分别用不同的TDataSetProvider
 
我现在正在做一个三层的应用。我的服务器端使用一个 TDataSerProvider,使用
ADOConnectong连接数据库(SQL Server ),一个ADOQuery用户对数据操作。
客户也是MDI的。每个子窗口上也都放着一个 TClientDataSet(动态创建的),所有
对数据的操作都是使用 ClientDataSet.CommandText 方法提交SQL语句实现的。没出现
你所说的问题啊?
 
kim_fu:
用commandtext当然没有这个问题,
如果你用applyupdate(0)就有问题了。
 
转到:
http://www.delphibbs.com/delphibbs/DispQ.asp?LID=1017731
 
多人接受答案了。
 
后退
顶部