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

在三层开发中,为了安全,通常,不会将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);


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

原则就是


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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值