如何用TClientDataSet控件给存储过程传递参数(100分)

  • 主题发起人 主题发起人 mycwcgr_temp
  • 开始时间 开始时间
M

mycwcgr_temp

Unregistered / Unconfirmed
GUEST, unregistred user!
如何用TClientDataSet控件给存储过程传递参数

1.在SQL 2000中定义了下面的存储过程
CREATE PROCEDURE QueryName
@inputname varchar(20)
AS
select * from ghc_name where name=@inputname
GO

2.在应用服务器中放入了Tadostrorproc和Tdatasetprovider控件与
存储过程QueryName 联系起来。

3.在客户程序中加入TclientDataset和TdataSource以及Tdbgrid控件,在TclientDataset控件上按右键
打开菜单选择 Fetch Params 并在参数@inputname中填入一个值,但是当我将TclientDataset的Active
属性设置为true时,Tdbgrid的表头正确,但是没有查询到记录,请问是为什么?我想参数的值我没有
错误,数据表中一定有这一条记录,是不是存储过程和Tadoquery的机制不同?
 
TClientDataSet.CommandText := 'Exec [ProcedureName] @Argument';
TDataSetProvider.Option :=TDataSetProvider.Option + [opAllowCommandText];
 
三层中,我是这样调用存储过程并传递参数的。
在应用层定义接口,调用存储过程。
(1)edit/Add to interfalce
function TRemDataModal.Callproc(const procname: WideString;
paranum: OleVariant): OleVariant;
var //定义接口
i:integer;
begin
with ADOStoredProc1 do
begin
ProcedureName:=procname;
Parameters.Refresh;
for i:=1 to Parameters.Count-1 do
Parameters.Value:=paranum[i-1];
ExecProc;
end;
(2)客户端:调用传递参数就行了。
frmdm.SocketConnection1.open;
frmdm.SocketConnection1.AppServer.smsproc('out',vararrayof([''+mobilenum+'',0,sysdate,content]));
frmdm.SocketConnection1.close;
试试看,我觉得效果不错。
 
to rainxy2002:
您的方法就要求在应用服务器端有Tadoquery控件,而本题在应用服务器端只有
Tadostrorproc和Tdatasetprovider控件

to IT书生:
您的方法可行,但与题目要求不符
 
客户端:
with TStringList.Create do
try
Add('GETSERIALID');
Add('P_SERIALTYPE='+IntToStr(SerialType));//参数名=值
Add('P_ARG1_I='+TableName); //参数名=值
Add('P_ARG2_I='+FieldName); //参数名=值
CommaText := FDataModuleDLL.cdsRunStoredProc.DataRequest(CommaText);
if (Values['RESULT']='-1')then
Result := StrToInt(Values['RESULT'])
else
Result := StrToInt(Values['P_NEWSERIALID']);
finally
Free;
end;
服务器:

function TAppSvrRDM.dspGetDataDataRequest(Sender: TObject;
Input: OleVariant): OleVariant;
var ReqDatas: TStrings;
begin
ReqDatas := TStringList.Create;
try
ReqDatas.CommaText := VarToStr(Input);
if ReqDatas.Count>=1 then
begin
GetDataFromStoredProcByParam(ReqDatas);
Result := ReqDatas.CommaText;
end;
finally
ReqDatas.Free;
end;
end;

procedure TAppSvrRDM.GetDataFromStoredProcByParam(
ReqData: TStrings);
var i: Integer;
p: TParam;
begin
spGetData.UnPrepare;
spGetData.StoredProcName := ReqData[0];
try
spGetData.Prepare; //不知为什么,使用这个过程虽然可以取到所有参数,但总抛出异常
except
on E: Exception do
if IsRDBMSError(E.Message) then
begin
DisConnectDB;
raise;
end;
end;
//------------------------------
ReqData.Delete(0);
for i:=0 to spGetData.ParamCount-1 do
begin
p := spGetData.Params;
if p.ParamType in [ptInput,ptInputOutput] then
p.Value := ReqData.Values[p.Name];
end;
//------------------------------
try
spGetData.ExecProc;
ReqData.Clear;
for i:=0 to spGetData.ParamCount-1 do
begin
p := spGetData.Params;
if p.ParamType in [ptOutput,ptInputOutput,ptResult] then
ReqData.Add(p.Name+'='+p.AsString);
end;
except
on E: Exception do
begin
if IsRDBMSError(E.Message) then
DisConnectDB;
raise;
end;
end;
end;

上述是用BDE实现的,转ADO的应该差不多吧,我看就在取参数那一段,IT书生的好象就可以了。
 
如何用TClientDataSet控件给存储过程传递参数?请不要跑题?
请问有没有人成功过?
 
没有跑题
服务器的spGetData就是一个存储过程。dspGetData是它的TDataSetProvider,
客户端cdsRunStoredProc是连接dspGetData的TClientDataSet.
关系如下:spGetData->dspGetData-客户端->cdsRunStoredProc
远程数据模块不用增加任何接口方法,就用下面的格式调用
Add('GETSERIALID'); //存储过程名
Add('P_SERIALTYPE='+IntToStr(SerialType));//参数名=值
Add('P_ARG1_I='+TableName); //参数名=值
Add('P_ARG2_I='+FieldName); //参数名=值
看代码吧,烦是烦了点,不过确实很灵活,你想运行哪个存储过程都可以。
 
ClientDataSet.CommandText:='exec QueryName '''+inputname+'''';
ClientDataSet.Execute;
 
多人接受答案了。
 
后退
顶部