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到此,服务端好了
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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;
运行着;接着编写客户端
客户端就很简单了
File>>New>>FireMonKey Mobile Application选择Blank Application
再加入DataSnap的Client
Fiel>>New>>Other>>DataSnap Server
点OK,下一步你选择哪个都可以,一直Next到测试端口连接那里(服务端要开启才能连接),Finish
会看到生成这些
在Unit1放入Grid,ClientDataSet,利用LiveBindings连接起来
加入个按钮调用服务端
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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;
去运行看看吧