XE5 变相连接数据库

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

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

打开XE5,点击菜单File>>New>>Other>>DataSnap ServerXE5 变相连接数据库

XE5 变相连接数据库然后一直Next(设置端口那里可默认,也可以改为自己要想的),最后Finish

到这一步会看到生成了这些XE5 变相连接数据库

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

接着打开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

XE5 变相连接数据库

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

会看到生成这些XE5 变相连接数据库

在Unit1放入Grid,ClientDataSet,利用LiveBindings连接起来XE5 变相连接数据库

加入个按钮调用服务端

 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

去运行看看吧