关于DCOM传递字符串数组!!

本文介绍了一种在客户端和服务端之间安全传递动态SQL语句的方法。通过将SQL语句存储在服务器的数据表中,并使用ID引用的方式减少直接传递SQL带来的风险。同时,详细展示了如何在客户端指定SQL语句ID及参数,以及服务器端如何解析这些参数并执行相应的SQL查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在三层开发中,为了安全,通常,不会将SQL语句直接传递到服务端;

那有些功能又不能写死的软件中。。特殊是SQL。

所以通常我们会在将一些SQL语句放在数据表中,给第一个SQL语句一个ID,

这样在客户端,仅指定ID就行,可是对于一个带查询条件的SQL语句,就需要带一个依据传递到 服务器端了。


比如:我们的数据表中存在:

ID    SQLSTRING

1      SELECT * FROM BASE_CLIENTDATA  WHERE  BH=:BH


服务器端:

functionReadData2(XH, ParamCount: Integer;
  Param: OleVariant): OleVariant;
  procedure GetSQLParameters(SqlText :string; var params :TStrings);
  var
    i,len :integer;
    start, over :integer;
  begin
    len := length(SqlText);
    start := 0;
    over := 0;
    for i:=1 to len do
    begin
        if SqlText[i] = ':' then
          start := i + 1
        else if ((SqlText[i] = ' ') and (start > 0))
          or ((i = len) and (start > 0)  
          or ((SqlText[i]=',') and (start > 0))
          or ((SqlText[i]=')') and (start > 0)) ) then
        begin
            if (i=len) and (SqlText[i]<>')') then
              over := i+1
            else
              over := i;
            params.Add(copy(SqlText,start,over-start));
            start := 0;
            over := 0;
        end;
    end;
  end;
type
  TData  =array[0..99] of string ;
var
   FSQL:String;
   Data :TData;
   i : Integer;
   ParamNames :TStrings;
begin
   try
     ADOQuery.DisableControls;
     ADOQuery.Close;
     ADOQuery.SQL.Text:='SELECT SQLSTRING FROM XT_SQLSTRING2 WHERE ID= '+INTTOSTR(XH);
     ADOQuery.Open;
     if ADOQuery.IsEmpty then
       FSQL := 'SELECT GETDATE() '
     else
       FSQL :=ADOQuery.FieldByName('SQLSTRING').asstring;
     ADOQuery.Close;

     ADOQuery.SQL.Text := FSQL;

     if (ParamCount >0 ) and (SizeOf(Param)>0) then  begin
        ParamNames := TStringList.Create;
        GetSqlParameters(FSQL, ParamNames);
        for i := 0 to ParamCount do  Data[i] := Param[i]; 
        for i:= Low(Data) to High(Data) do
        begin
            ADOQuery.Parameters.ParamValues[ParamNames[i]] := Param[i];
        end;
     end;    

     ADOQuery.Open;


   。。。。。。。。。。。。。。。。。

end;

客户端:

var
//   RV :Variant;
   V,SendV:OLEVariant;
   AR:_Recordset;
   AStream:_Stream;  //adodb_tlb{从IDE菜单Project-import type library...引入“Microsoft ActiveX Data Object 2.8 Library”}
   MS1:TMemoryStream;
   P:Pointer;
   s:string;

   i,n : Integer;
begin
//   RV := Disp_BaseDoc.ProF_ReadAdoData(ASQL);
  n := Length(Param);
  SendV := VarArrayCreate([0,n],varOleStr);
  for I := Low(Param) to High(Param) do
    SendV[i] := Param[i]; 
   try
     s:='';
     V:=Disp_BaseDoc.ProF_ReadAdoData2(XH,n,SendV);


。。。。。。。。。。。。。。。。。。

原则就是


我们就一个 参数数组传递到服务端,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值