zoukankan      html  css  js  c++  java
  • XE5 变相连接数据库

    XE5中Android不支持SQL Server的连接,所以近来弄出了个歪办法:

    通过DataSnap(Web Services也可)来获取数据,现在建立一个DataSnap吧

    打开XE5,点击菜单File>>New>>Other>>DataSnap Server

    然后一直Next(设置端口那里可默认,也可以改为自己要想的),最后Finish

    到这一步会看到生成了这些

    在ServerContainerUnit1.Pas中加入关系如图所示(连接数据库的控件可换为你所熟用的)

    接着打开ServerMethodsUnit1.Pas编写获取数据的代码了

    public下加入 function GetTableData(AParams:OleVariant):OleVariant;然后Ctrl+Shift+C快速生成模版

    AParams 不要看它是OleVariant,其实它是TParams,通过另外一个过程将它转换成OleVariant的,

    为什么要这么麻烦,因为XE5 Android中直接传输TParams的会出现Remote Error等等的错误;

    将AParams再转换回TParams(我在其中加入3项东东,一个是表名,一个是查询的字段,一个是查询条件),

    将其中的内容拼合成查询语句,后用ServerContainerUnit1.Pas中的ADOQuery1查询

    Result值就是ServerContainerUnit1.Pas的DataSetProvider1.Data到此,服务端好了

    function TServerMethods1.GetTableData(AParams: OleVariant):OleVariant;
    var
     ATemp:TParams;
     tmpVar:Variant;
    begin
      ATemp := TParams.Create;
      VariantToParams(tmpVar,ATemp);
      With ServerContainer1.qry1 do
      begin
        try
          Close;
          SQL.Clear;
          SQL.Add('Select '+ATemp.ParamByName('Fields').AsString+
                  ' From '+ATemp.ParamByName('Table').AsString+
                  ' Where 1=1 '+ATemp.ParamByName('WhereStr').AsString);
          Open;
          Resut :=ServerContainer1.DataSetProvider1.Data,ftStream;
        except
        end;
        Close;
      end;
    end;
    View Code

    运行着;接着编写客户端

    客户端就很简单了

    File>>New>>FireMonKey Mobile Application选择Blank Application

    再加入DataSnap的Client

    Fiel>>New>>Other>>DataSnap Server

    点OK,下一步你选择哪个都可以,一直Next到测试端口连接那里(服务端要开启才能连接),Finish

    会看到生成这些

    在Unit1放入Grid,ClientDataSet,利用LiveBindings连接起来

    加入个按钮调用服务端

     1 //Params转Variant
     2 function ParamsToVariant(par:TParams): OleVariant;
     3 var
     4   tmpv:OleVariant;
     5   n,i:integer;
     6 begin
     7   try
     8     tmpv:=VarArrayCreate([1,par.Count*3],VarVariant);
     9     n:=0;
    10     i:=0;
    11     while par.Count>i do
    12     begin
    13       tmpv[n+1]:=Ord(par.Items[i].DataType);
    14       tmpv[n+2]:=par.Items[i].Name;
    15       tmpv[n+3]:=par.Items[i].Value;
    16       i:=i+1;
    17       n:=n+3;
    18     end;
    19     result:=tmpv;
    20   except
    21     Exit;
    22   end;
    23 end;
    24 
    25 //Variant转Params
    26 procedure VariantToParams(input:OleVariant;par:TParams);
    27 var
    28   n, i:integer;
    29 begin
    30   try
    31     n:=0;
    32     i:=0;
    33     par.Clear;
    34     while VarArrayHighBound(input,1)>=(n+3)do
    35     begin
    36       par.CreateParam(TFieldType(input[n+1]),input[n+2],ptInput);
    37       par.Items[i].Value := input[n+3];
    38       par.Items[i].Size :=SizeOf(input[n+3]);
    39       n:=n+3;
    40       i:=i+1;
    41     end;
    42   except
    43     Exit;
    44   end;
    45 end;
    46 
    47 //调用服务端
    48 procedure TForm1.Button2Click(Sender: TObject);
    49 const
    50   Fields:string=' ks_bh,ks_mc,cp_lb,pt,pt2,pt3 ';
    51   TableName:string=' cpzl ';
    52 var
    53  WhereStr:string;
    54  AClient:TServerMethods1Client;
    55  tmpVar:Variant;
    56  tmpParams:TParams;
    57 begin
    58   if Trim(ClearingEdit3.Text)<>'' then
    59   begin
    60     case ComboBox1.ItemIndex of
    61      0: WhereStr:=' and ks_bh='+QuotedStr(ClearingEdit3.Text);
    62      1: WhereStr:=' and ks_mc='+QuotedStr(ClearingEdit3.Text);
    63      2: WhereStr:=' and cp_lb='+QuotedStr(ClearingEdit3.Text);
    64     end;
    65   end;
    66   try
    67     tmpParams:= TParams.Create;
    68     tmpParams.Clear;
    69     with tmpParams.CreateParam(ftString,'Fields',ptInput) do
    70     begin
    71      Value := Fields;
    72     end;
    73     with tmpParams.CreateParam(ftString,'Table',ptInput) do
    74     begin
    75      Value := TabeName;
    76     end;
    77     with tmpParams.CreateParam(ftString,'WhereStr',ptInput) do
    78     begin
    79      Value := WhereStr;
    80     end;
    81     tmpVar:=ParamsToVariant(tmpParams);
    82     AClient := TServerMethods1Client.Create(ClientModule1.SQLConnection1.DBXConnection);
    83    try
    84      ClientData1.Data:= AClient.GetTableData(tmpVar);
    85     end;
    86    except
    87     raise;
    88    end;
    89   finally
    90     FreeAndNil(tmpParams);
    91     FreeAndNil(AClient);
    92     tmpVar := Unassigned;
    93   end;
    94 end;
    View Code

    去运行看看吧

  • 相关阅读:
    php编程规范整理
    约瑟夫环问题的实现
    MYSQL中SHOW的使用整理收藏
    mysql使用存储过程&函数实现批量插入
    浅谈select for update 和select lock in share mode的区别
    jQuery对象扩展方法(Extend)深度解析
    WCF系列教程之WCF操作协定
    WCF系列教程之WCF实例化
    WCF系列教程之WCF中的会话
    WCF系列教程之WCF服务协定
  • 原文地址:https://www.cnblogs.com/Values/p/3419770.html
Copyright © 2011-2022 走看看