firedac的TFDStoredProc动态创建并调用存储过程

 

1)中间件执行存储过程

sp.Close;
sp.StoredProcName := procName;
sp.Prepare;  // 生成存储过程的参数列表,无任何OUTPUT的存储过程,也会自动生成一个@ReturnValue的返回值参数
params := TFDParams.Create;
try
  UnpackFDParams(inParams, params);  // 还原客户端上传的参数
  for i:=0 to params.Count -1 do
    for h:=0 to d.procOpen.ParamCount-1 do
      if sp.Params[h].Name = params[i].Name then
      begin
         sp.Params[h].Value := params[i].Value;  // 给存储过程的参数赋值
         Break;
      end;
finally
  params.Free;
end;
sp.open;
2)客户端调用远程方法执行存储过程

procedure TfrmMain.Button2Click(Sender: TObject);
begin
  cds2.Params.Clear;
  cds2.Params.CreateParam(ftString,'@workno',ptInput).Value :='1';  // 参数前面记得要加@
  cds2.Data := ProcOpen('9999','3',PackageParams(cds2.Params));
end;

3)带OUTPUT的存储过程

function TServerMethods1.spOpenOut(const accountNo, spName: WideString; inParams: OleVariant): OleVariant;
var
d: TfrmDB;
params: TFDParams;
i: Integer;
param: TFDParam;
begin
Result := null;
if (accountNo = '') or (spName = '') then
Exit;
d := GetDBPool(accountNo).Lock;
if not Assigned(d) then
Exit;
try
try
d.procOpen.Close;
d.procOpen.StoredProcName := spName;
d.procOpen.Prepare;
params := TFDParams.Create;
try
UnpackFDParams(inParams, params);
for i := 0 to params.Count - 1 do
begin
param := d.procOpen.FindParam(params[i].Name);
if not Assigned(param) then
Continue;
param.value := params[i].value;
end;
finally
params.Free;
end;

Result := VarArrayCreate([0, 1], varVariant);
Result[0] := d.dspProcOpen.Data; // 查询数据集
Result[1] := PackageFDParams(d.procOpen.params); // OUTPUT参数

except
on e: Exception do
begin
Result := null;
Log.WriteLog('TServerMethods1.spOpenOut ' + e.Message);
Exit;
end;
end;
finally
d.procOpen.Close;
GetDBPool(accountNo).Unlock(d);
end;
end;

posted @   delphi中间件  阅读(3656)  评论(1编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
历史上的今天:
2012-10-28 webservices base64编码
2012-10-28 webservices传文件
2012-10-28 webservices传base64字串
2012-10-28 webservices 字节数组 Base64编码
2012-10-28 webservices传数据
点击右上角即可分享
微信分享提示