# Delphi XE 10 跨平台三层数据库应用教程
前言:
Delphi XE 开始越来越庞大,比经典的Delphi7难用,但依然是目前所有跨平台开发工具中开发效率最高、最容易上手的,其快速设计RAD理念是无与伦比的符合人性(什么?是懒惰)。
目前网上XE10类似教程很少,而且学习途中遇到一些问题就难以继续了,经本菜鸟千辛万苦的求索,特推出Delphi XE 10系列教程。
**三层**数据库应用是目前最简单、方便、易扩展的架构,而**跨平台**应用又是所谓的“互联网+”最需要的,下面的教程分服务器端和客户端两大部分完成该设计。
# 一、**Delphi XE10 datasnap服务器设计**
## (1)生成DataSnap服务器的框架
初学者都是呆子,还是用向导吧,主菜单“File”->“New”->“Other…”得到“New Items”向导对话框。见图一。
![](https://img2018.cnblogs.com/blog/275839/201810/275839-20181008170515199-727650974.png)
图一、向导
一般选择有窗口的Forms程序,如果是正式场合,建议Service程序。见 图二。
![](https://img2018.cnblogs.com/blog/275839/201810/275839-20181008170533493-551140298.png)
图二、选择应用类型
如果服务器程序运行在Windows平台就选“VCLapplication”,如果要跨平台,还是选“FireMonkeyapplication”,但生成的文件要大一些。见图三。
![](https://img2018.cnblogs.com/blog/275839/201810/275839-20181008170608398-2021276590.png)
图三、选择应用基本库源
默认TCP/IP为通讯协议,简单快速,菜鸟专用的Sample Methods用于测试,见图四。
![](https://img2018.cnblogs.com/blog/275839/201810/275839-20181008170617665-1859026604.png)
图四、选择通讯等参数
缺省211端口,别忘了“Test Port”一下更健康,见图五。
![](https://img2018.cnblogs.com/blog/275839/201810/275839-20181008170628805-100155271.png)
图五、测试端口
不要使用默认的“TComponent”,而用TDSServerModule作为数据服务提供主体,非常方便以后变更为能挣钱的Service应用服务。
![](https://img2018.cnblogs.com/blog/275839/201810/275839-20181008170637142-539987885.png)
图六、选择服务模式
Finish这个向导后,硬盘一阵轰鸣,自动生成了工程及其三个主文件,图七:
**ServerContainerUnit1.pas 放的是网络服务相关控件,非高手莫入**。
**ServerMehtodsUnit1.pas 就是我们第二步主要的活动场所。**
**Unit1.pas 服务器主界面,放个TLabel表示“我是服务器”即可,不必关注。**
![](https://img2018.cnblogs.com/blog/275839/201810/275839-20181008170658440-835167853.png)
图七、完成框架
## (2) 数据库设置
进入**ServerMehtodsUnit1.pas **对应的窗口
可用老旧简单的 BDE或ADO,也可用最新高大上的FireDAC,都XE10了,还是高点吧。
拖入(好吧,当一次C程序员嘲笑的Delphi拖拉员)三个控件即可:
**TFDConnection, TFDQuery **和 **TDataSetProvider**
由下图八可知FireDAC连接逻辑简单,而且大跨数据库平台!
![](https://img2018.cnblogs.com/blog/275839/201810/275839-20181008170705758-1649700837.png)
图八、数据库连接构架
**库驱动连接器: TFDConnection**,
把自带的SqlLite例子库复制到当前目录下备用:
C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\17.0\\Samples\\Data\\fddemos.sdb
右键菜单“Connection Editor…”设置并测试, 设置Connected属性为True,图九和十。
![](https://img2018.cnblogs.com/blog/275839/201810/275839-20181008170714276-758354611.png)
图九、连接器设置入口
![](https://img2018.cnblogs.com/blog/275839/201810/275839-20181008170735821-1207304985.png)
图十、连接器设置并检测
**数据集:TFDQuery**,设置其Connection属性为刚才测试好的FDConnection1,
设置SQL属性为任意sql语句如:select \* from orders, 再令其Active属性为True
最后拖入**TDataSetProvider **将数据集对外服务,用其DataSet属性连接到刚才的FDQurey1
如果不用Connecton Editor.., 可以设置FDConnection1.Params的内容为:
*Database=E:\\prj\\t\\server\\fddemo.sdb*
*//若改为 Database=.\\fddemo.sdb 则表示db文件和exe文件在同一个目录下*
*DriverID=SQLite*
*注意:**需要确保**sdb**文件存在,否则**firedac**会直接生成一个空的**sdb**同名文件,不报错,直到运行后客户端程序访问才报**xxTable does not exist* *错**.*
最后拖入**TDataSetProvider **将数据集对外服务,用其DataSet属性连接到刚才的FDQurey1。
## (3) 增加服务内容
向导生成的ServerMethord1单元只提供了两个简单的服务函数
function EchoString(Value: string): string;
functionReverseString(Value: string): string;
现在增加一个有用点的:
[![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "复制代码")
~~~
function TServerMethods1.ChangeSql(Value:string): Integer;
begin
FDQuery1.Active := False;
FDQuery1.SQL.Text := Value;
FDQuery1.Active := True;
Result := FDQuery1.RecordCount;
end;
~~~
[![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "复制代码")
最后可在主窗口Form1中加入个Tlabel,设置Text 为“服务中…”表示自己是个服务器,要不然后面客户端连接不上时,找不到服务器界面。
## (4) 发布运行
测试通过后即可在prj树中右键Release菜单中选build制作release版本,见图十一,否则默认都是debug版本。注意win7防火墙弹出阻止时,许可它过外网。
![](https://img2018.cnblogs.com/blog/275839/201810/275839-20181008170751180-781908420.png)
图十一、制作发行版
经测试xe10下编译的服务器程序,只需要发布exe和sdb文件即可,无需其他驱动或dll等,并且在win7和winxp下均能正常服务。
# 二、DataSnap的跨平台客户端设计
## (1) 生成客户端框架
File->New->Muti-Device Application, 图十二。
![](https://img2018.cnblogs.com/blog/275839/201810/275839-20181008170800786-149483847.jpg)
图十二、新建跨平台程序
选择第一个空白的吧“BlankAppliction”, 白纸好涂鸦啊!
**为了逻辑和界面分离,New一个 DataModule**。
## (2) 设置连接
在DataModule中放入**TSQLConnection**、**TDSPProviderConnection**、**TClientDataSet**和**TDataSource**四个控件,
按照逻辑用DSProviderConnection1就可用连接到服务器了,可Delphi偏偏要用TSQLConnection。选择置其属性ConnectionName中自然列出的“DataSnapCONNECTION”,紧临的属性Driver值自动变为DataSnap。
TDSPProviderConnection.ServerClassName 为服务器端对应类名TServerMethods1,
**接下来只需要 **把TDSPProviderConnection.SqlConnection 连接到TSQLConnection,TClientDataSet.RemoteServer连接到TDSPProviderConnection,即可把他们三个串通一气。当然TDataSource.DataSet也要连接到TClientDataSet。见图十三。
![](https://img2018.cnblogs.com/blog/275839/201810/275839-20181008170811218-271955555.png)
图十三、设置数据连接路线
**注意:**
现在该是激活他们的时候了:TSQLConnection.Active 设置为True(这时可能会有数据库口令验证),TDSPProviderConnection.Connected自动变为True了,**然后在TClientDataSet.ProviderName才能看见传递过来的名称“DataSetProvider1”**,选择之。最后设置TClientDataSet..Active 为True,没有错误提示才算真正连接好了。
## (3) 制作界面
制作界面在主窗口unit1里进行。作为数据库客户端的基本配置,TBindSourceDB和TGrid组合来代LiveBinding替老Delphi7时代的“数据敏感”,以适应不支持“数据敏感”的OS系统如Android。当然加入一个TBindNavigator能让你浏览数据时更舒服一点,不加也无大碍。见图十四。
![](https://img2018.cnblogs.com/blog/275839/201810/275839-20181008170824818-1882474921.png)
图十四、加入显示数据控件
TBindSourceDB.DataSet 和 DataSource 必须要 uses了datamodule: unit2.pas 后才会自动出现DataModule2.ClientDataSet1 和 DataModule2.DataSource1,选择设置之。
![](https://img2018.cnblogs.com/blog/275839/201810/275839-20181008171245333-323186137.png)
---
![](https://images2018.cnblogs.com/blog/275839/201809/275839-20180909112031357-56980394.png)
接下来就是要所谓“LiveBinding”了,TBindSourceDB的右键菜单上有个“BindVirsully..”从老Delphi7来的人好怕怕哦,没见过这架势如图十五:
[![](http://s3.sinaimg.cn/mw690/001BLzizgy720vENDYC62)](http://photo.blog.sina.com.cn/showpic.html#blogid=&url=http://album.sina.com.cn/pic/001BLzizgy720vENDYC62)
图十五、绑定数据连接
图十五中蓝色箭头就是我们需要画出来的。
关闭后回去发现多出一个BindingList1的控件来,而且数据已经输送过来啦!
图十六。
![](https://img2018.cnblogs.com/blog/275839/201810/275839-20181008171453315-1428800170.png)
图十六、连通数据库
太高兴了,赶紧保存并编译运行,结果大失所望,没有数据。原来还有很多工作没有做,如控制连接、生成服务器对应方法等。
**遇到问题与解决: **
** 1. 提示 Cannot change this property when using LiveBindings**
![](https://images2018.cnblogs.com/blog/275839/201809/275839-20180909112825930-102151154.png)
**解决方式:**
![](https://images2018.cnblogs.com/blog/275839/201809/275839-20180909113321626-1647058732.png)
* * *
在unit2的窗口中生成服务器对应方法GenerateDataSnap client classes菜单选择后,图十七,自动生成unit3,其中主要是TServerMethods1Client类及其方法,都是服务器上的服务器方法映射到客户端来的,方便client调用服务,具体代码不必去看(什么,不求甚解,是脑力不济)。
![](https://img2018.cnblogs.com/blog/275839/201810/275839-20181008171509760-932068571.png)
图十七、自动生成服务方法映射
控制连接:在界面窗口中加入IP和端口(默认为211,是不是想自诩为中国的名牌大学出品)
![](https://img2018.cnblogs.com/blog/275839/201810/275839-20181008171518947-698557958.png)
图十八、加入控制连接控件
“连接”按钮button1代码如下:
procedure TForm1.Button1Click(Sender:TObject);
var
dm: TServerMethods1Client; //就是上一步自动生成的unit3里的那个映射类
begin // 别忘了uses Unit3, Unit2;
try
//连接指定IP和Port的应用服务器
DataModule2.SQLConnection1.Close; // DataModule2就是放连接器那个数据模块
DataModule2.SQLConnection1.Params.Values\['HostName'\] := edtIP.Text;
DataModule2.SQLConnection1.Params.Values\['Port'\] := edtPort.Text;
try
DataModule2.SQLConnection1.Open;
try
//创建应用服务器上的方法在客户端的实现类: 即映射方法类
dm :=TServerMethods1Client.Create(DataModule2.SQLConnection1.DBXConnection);
//执行服务器上的方法
ShowMessage(dm.ReverseString(edtIP.Text)); //系统带的例子方法
dm.ChangeSql(edtSql.Text); // 我们在服务器程序中手工添加的执行sql方法
finally
dm.Free;
end;
DataModule2.ClientDataSet1.Close;
DataModule2.ClientDataSet1.Open; //开启客户端数据集
except
on E: Exception do
ShowMessage(E.Message);
end;
finally
DataModule2.SQLConnection1.Close;
end;
end;
注意:如果启动就连接执行,在win32下正常,在Android上会黑屏。
Win32版在xp上不能正常使用数据库功能,普通服务方法能用。
## (4) 手机调试和发布
用usb连接上手机,并安装好手机驱动(如果是华为手机,则安装华为手机助手),并设置手机为“USB 调试”状态,见图十九。
![](https://img2018.cnblogs.com/blog/275839/201810/275839-20181008171535276-1374397499.png)
图十九、设置USB连接手机为调试状态
这时候,在Delphi的工具栏右上方自动出现手机型号,见图二十,此时可以直接点击运行,约等待1分中,就自动在手机上安装好了。
![](https://img2018.cnblogs.com/blog/275839/201810/275839-20181008171546954-1967326846.png)
图二十、确保Delphi识别连接好的手机型号
正式发布手机apk时注意:
默认的Release配置会有位置、通话记录、摄像头等许多令人不悦的隐私选项,统统的设置为false,见图二十一,只留一个“Internet”为true(不知到为什么,那就别搞软件开发了)。
![](https://img2018.cnblogs.com/blog/275839/201810/275839-20181008171600582-132905291.jpg)
图二十一、手机隐私权限设置
最后build “Release”版,见图二十二,在目录xxx\\client\\Android\\Release\\Project1\\bin下面一个Project1.apk赫然在目,美中不足是大了点约9.5MB。安装在各种手机上测试吧!见图二十三。
![](https://img2018.cnblogs.com/blog/275839/201810/275839-20181008171611577-1382776837.png)
图二十二、制作手机发行版apk文件
![](https://img2018.cnblogs.com/blog/275839/201810/275839-20181008171629139-4142503.jpg)
图二十三、手机上用SQL语句自由访问服务器
在有的手机上安全软件会提示有广告插件:a.banner.doubleClick,网上查了下,是google自带的什么东东,脑力不济,管不了这么多了。
# 三、总结
本教程完成了Delphi XE 10 下,跨平台三层数据库程序例子,其中服务器程序连接数据库,客户端程序可以是PC、Android手机,发布仅需要一个exe或apk文件,无需安装其他驱动、库,无需设置注册等恼人的活动。
虽然发布简单,功能强大,可以从客户端用SQL语句访问服务器端任何数据,然而,实际应用还是需要在服务器程序上做复杂的权限控制、流量监控、负载均衡、缓冲池等,不过这些是任何服务器程序都不可回避的,不能怪Delphi吧
- 1.制作Android Splash启动界面
- 2.delphi之完美Splash方案
- 3. Android实例-解决虚拟键盘遮挡问题
- 0.Android开发小技巧
- 设 置 您 的 开 发 环 境 Windows PC(Android)
- Delphi XE控件
- 手机屏幕自适应程序问题
- 手势操作
- delphi xeandroid对硬件操作
- Datasnap
- Delphi XE 10 跨平台三层数据库应用教程
- 开发数据库三层应用的DataSnap
- ListView
- delphi xe10之控件 listview 的强大功能
- FMX.TListView的基本用法
- 初探ListView 的使用方法
- Delphi 常用控件之TlistView总结
- ListView基本用法大全
- android实现透明度可以调整的对话框
- android 获取网络状态
- FMXUI
- FMXUI - ListView用法简介