请帮助!关于存储过程的问题。 (30分)

  • 主题发起人 主题发起人 HHSH
  • 开始时间 开始时间
H

HHSH

Unregistered / Unconfirmed
GUEST, unregistred user!
我正在做一个三层应用。现在,已在数据库(oracle)中做好了存储过程,想在客户端调用
它。Tstoredpro控件的设置与调用我倒是会,但是现在是关键是放在哪儿,怎么调用。
对此,我查询了从前好多贴子,但说法不一。请大家指点:
1。Tstoredproc就该放在中间层,是吧?它的属性设置我很完成了。但还需要在中间层上
加别的控件吗?要不要用Tdatasetprovider?
2。客户端是否用Tclientdataset?怎样与中间层的Tstoredproc联系起来?再怎样执行它?
我曾试过在客户端上放Tstroedproc,但是好象必须得有BDE的支持,不方便。
要说明的是:原来的连接都用的是:中间层:Tquery,Tdatasetprovider,客户端Tsocketconnection
,Tclientdataset.
 
1 是,要。
2 对。你还要放一个,DCOM或者SOCKET控件。设置好REMOTEServer,
参考DELPHI范例中MIDAS 的EMPEDIT
 
可以这样用:
try
tmpCDS := TClientDataset.Create(Application);
//创建临时ClientDataset
tmpCDS.RemoteServer := dmAutoSale.DCOMCSaleClient;//给临时ClientDataset付RemoteServer
tmpCDS.ProviderName := 'dspSPDJ';//给临时ClientDataset付ProviderName
with tmpCDSdo
begin
Close;
CommandText := 'bas_DWDZConfirm';//存储过程名bas_DWDZConfirm
Params.Clear;//清空并创建参数
Params.CreateParam(ftString,'@YDDH',ptInPut).AsString := cdsUSD_BYDDY.fieldbyname('YDDH').Asstring;
Params.CreateParam(ftSmallInt,'@DZYWDW',ptInPut).AsInteger := cdsUSD_BYDDY.Fieldbyname('DZYWDW').asInteger;
try
Execute;
finally
end;
end;
finally
tmpCDS.Free;
end;
 
首先,在中间层的Remote DataModule中你要放一个TStoreProc控件,指定它的Database连
接,并在StoreProcName属性中指定一个存储过程。
然后,你要在Remote DataModule中放一个TDataSetProvider控件,并在它的DataSet属性中
指定你刚才放的TStoreProc控件,并把它的Options属性中的poAllowCommandText属性设为
True。
第三步,在你的客户端程序中的Form或DataModule中放一个连接的控件
(如DCOMConnection,SocketConnection等),以SocketConnection为例,在Address属性
中指明中间层的IP,然后在ServerName下拉列表中选择一个服务(就是你刚才作的中间层)

第四步,放一个TClientDataSet控件,把它的RemoteServer属性设为刚才的SocketConnection
控件,然后在ProviderName属性中选择你中间层中指向TStoreProc控件的那个TDatasetProvider,
然后就可以在需要存储过程的地方调用该过程,如:
ClientDataSet.Close;
ClientDataSet.FetchParam;
ClientDataSet.Params.ParambyName('Param1').AsString := 'Param1';
...
ClientDataSet.Execute;
OK,一切搞定!!!
 
多人接受答案了。
 
后退
顶部