Delphi XE 10 跨平台三层数据库应用教程

前言:

Delphi XE 开始越来越庞大,比经典的Delphi7难用,但依然是目前所有跨平台开发工具中开发效率最高、最容易上手的,其快速设计RAD理念是无与伦比的符合人性(什么?是懒惰)。

目前网上XE10类似教程很少,而且学习途中遇到一些问题就难以继续了,经本菜鸟千辛万苦的求索,特推出Delphi XE 10系列教程。

三层数据库应用是目前最简单、方便、易扩展的架构,而跨平台应用又是所谓的“互联网+”最需要的,下面的教程分服务器端和客户端两大部分完成该设计。

一、Delphi XE10 datasnap服务器设计

(1)生成DataSnap服务器的框架

初学者都是呆子,还是用向导吧,主菜单“File”->“New”->“Other…”得到“New Items”向导对话框。见图一。

图一、向导

一般选择有窗口的Forms程序,如果是正式场合,建议Service程序。见 图二。

图二、选择应用类型

如果服务器程序运行在Windows平台就选“VCLapplication”,如果要跨平台,还是选“FireMonkeyapplication”,但生成的文件要大一些。见图三。

 
图三、选择应用基本库源

​默认TCP/IP为通讯协议,简单快速,菜鸟专用的Sample Methods用于测试,见图四。

图四、选择通讯等参数

​缺省211端口,别忘了“Test Port”一下更健康,见图五。

图五、测试端口

不要使用默认的“TComponent”,而用TDSServerModule作为数据服务提供主体,非常方便以后变更为能挣钱的Service应用服务。

图六、选择服务模式

​Finish这个向导后,硬盘一阵轰鸣,自动生成了工程及其三个主文件,图七:

ServerContainerUnit1.pas   放的是网络服务相关控件,非高手莫入

ServerMehtodsUnit1.pas    就是我们第二步主要的活动场所。

Unit1.pas    服务器主界面,放个TLabel表示“我是服务器”即可,不必关注。

图七、完成框架

(2) 数据库设置

进入ServerMehtodsUnit1.pas 对应的窗口

可用老旧简单的 BDE或ADO,也可用最新高大上的FireDAC,都XE10了,还是高点吧。

拖入(好吧,当一次C程序员嘲笑的Delphi拖拉员)三个控件即可:

TFDConnection,  TFDQuery  和  TDataSetProvider

由下图八可知FireDAC连接逻辑简单,而且大跨数据库平台!

图八、数据库连接构架

库驱动连接器: TFDConnection

把自带的SqlLite例子库复制到当前目录下备用:

C:\Users\Public\Documents\Embarcadero\Studio\17.0\Samples\Data\fddemos.sdb

右键菜单“Connection Editor…”设置并测试,  设置Connected属性为True,图九和十。

图九、连接器设置入口
 
 
图十、连接器设置并检测

数据集: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;

现在增加一个有用点的:

function TServerMethods1.ChangeSql(Value:string): Integer;
begin FDQuery1.Active := False;
FDQuery1.SQL.Text := Value;
FDQuery1.Active := True;
Result := FDQuery1.RecordCount; end;

最后可在主窗口Form1中加入个Tlabel,设置Text 为“服务中…”表示自己是个服务器,要不然后面客户端连接不上时,找不到服务器界面。

(4) 发布运行

测试通过后即可在prj树中右键Release菜单中选build制作release版本,见图十一,否则默认都是debug版本。注意win7防火墙弹出阻止时,许可它过外网。

图十一、制作发行版

​经测试xe10下编译的服务器程序,只需要发布exe和sdb文件即可,无需其他驱动或dll等,并且在win7和winxp下均能正常服务。

二、DataSnap的跨平台客户端设计

(1) 生成客户端框架

File->New->Muti-Device Application, 图十二。

图十二、新建跨平台程序

选择第一个空白的吧“BlankAppliction”, 白纸好涂鸦啊!

为了逻辑和界面分离,New一个 DataModule

(2) 设置连接

在DataModule中放入TSQLConnectionTDSPProviderConnectionTClientDataSetTDataSource四个控件,

按照逻辑用DSProviderConnection1就可用连接到服务器了,可Delphi偏偏要用TSQLConnection。选择置其属性ConnectionName中自然列出的“DataSnapCONNECTION”,紧临的属性Driver值自动变为DataSnap。

TDSPProviderConnection.ServerClassName 为服务器端对应类名 TServerMethods1,

接下来只需要 把TDSPProviderConnection.SqlConnection 连接到TSQLConnection,TClientDataSet.RemoteServer连接到TDSPProviderConnection,即可把他们三个串通一气。当然TDataSource.DataSet也要连接到TClientDataSet。见图十三。

图十三、设置数据连接路线

注意:

现在该是激活他们的时候了:TSQLConnection.Active 设置为True(这时可能会有数据库口令验证),TDSPProviderConnection.Connected自动变为True了,然后在TClientDataSet.ProviderName才能看见传递过来的名称“DataSetProvider1”,选择之。最后设置TClientDataSet..Active 为True,没有错误提示才算真正连接好了。

(3) 制作界面

制作界面在主窗口unit1里进行。作为数据库客户端的基本配置,TBindSourceDB和TGrid组合来代LiveBinding替老Delphi7时代的“数据敏感”,以适应不支持“数据敏感”的OS系统如Android。当然加入一个TBindNavigator能让你浏览数据时更舒服一点,不加也无大碍。见图十四。

图十四、加入显示数据控件

TBindSourceDB.DataSet  和  DataSource 必须要  uses了datamodule: unit2.pas 后才会自动出现DataModule2.ClientDataSet1 和  DataModule2.DataSource1,选择设置之。

---

​接下来就是要所谓“LiveBinding”了,TBindSourceDB的右键菜单上有个“BindVirsully..”从老Delphi7来的人好怕怕哦,没见过这架势如图十五:

图十五、绑定数据连接

图十五中蓝色箭头就是我们需要画出来的。

关闭后回去发现多出一个BindingList1的控件来,而且数据已经输送过来啦!

图十六。

图十六、连通数据库

​太高兴了,赶紧保存并编译运行,结果大失所望,没有数据。原来还有很多工作没有做,如控制连接、生成服务器对应方法等。

遇到问题与解决: 

  1.   提示 Cannot change this property when using LiveBindings

解决方式:


在unit2的窗口中生成服务器对应方法GenerateDataSnap client classes菜单选择后,图十七,自动生成unit3,其中主要是TServerMethods1Client类及其方法,都是服务器上的服务器方法映射到客户端来的,方便client调用服务,具体代码不必去看(什么,不求甚解,是脑力不济)。

图十七、自动生成服务方法映射

控制连接:在界面窗口中加入IP和端口(默认为211,是不是想自诩为中国的名牌大学出品)

图十八、加入控制连接控件

​“连接”按钮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 调试”状态,见图十九。

图十九、设置USB连接手机为调试状态

这时候,在Delphi的工具栏右上方自动出现手机型号,见图二十,此时可以直接点击运行,约等待1分中,就自动在手机上安装好了。

图二十、确保Delphi识别连接好的手机型号

​正式发布手机apk时注意:

默认的Release配置会有位置、通话记录、摄像头等许多令人不悦的隐私选项,统统的设置为false,见图二十一,只留一个“Internet”为true(不知到为什么,那就别搞软件开发了)。

图二十一、手机隐私权限设置

最后build “Release”版,见图二十二,在目录xxx\client\Android\Release\Project1\bin下面一个Project1.apk赫然在目,美中不足是大了点约9.5MB。安装在各种手机上测试吧!见图二十三。

图二十二、制作手机发行版apk文件
 
图二十三、手机上用SQL语句自由访问服务器

​在有的手机上安全软件会提示有广告插件:a.banner.doubleClick,网上查了下,是google自带的什么东东,脑力不济,管不了这么多了。

三、总结

本教程完成了Delphi XE 10 下,跨平台三层数据库程序例子,其中服务器程序连接数据库,客户端程序可以是PC、Android手机,发布仅需要一个exe或apk文件,无需安装其他驱动、库,无需设置注册等恼人的活动。

虽然发布简单,功能强大,可以从客户端用SQL语句访问服务器端任何数据,然而,实际应用还是需要在服务器程序上做复杂的权限控制、流量监控、负载均衡、缓冲池等,不过这些是任何服务器程序都不可回避的,不能怪Delphi吧

Delphi XE 10 跨平台三层数据库应用教程的更多相关文章

  1. 【转】10 个MySQL数据库备份教程推荐

    10 个MySQL数据库备份教程推荐 MySQL是动态网站开发中最著名的开源数据库系统.如果你在网站中使用了MySQL,那么你应该定期备份你的数据以防止它丢失. 本文将介绍自动或手动备份MySQL数据 ...

  2. Delphi xe 10.3.2-快递接口封装-【快递鸟(即时查询和单号识别)】

    编译环境:Windows 7 +Delphi xe 10.3.2 封装了快递鸟接口,注意的坑:MD5要转为小写. function TKDniaoAPI.StrtoMd5(const str: str ...

  3. 常用加密算法-Delphi XE 10.3.3

    主要用到  DELPHI XE 10.2新增HASH函数 class function TUtils.GetStringMD5(const AInPut: string): string; begin ...

  4. delphi xe 10.3 利用Git组群开发,Git服务器安装,Git 拉取,提交,推送相关设置操作

    1. Git服务器安装, 参考 https://blog.csdn.net/u012842630/article/details/97175397 Git服务器官方网站,要FQ. 2. 工具软件 gi ...

  5. Delphi XE 10.2.3使用CEF4Delphi取网页元素时碰到 变问号?的处理

    用CEF4Delphi取网页元素时碰到ElementInnerText里含有" " 比如网页源码里是"内容 "取出来显示就变成"内容?" 搜 ...

  6. Delphi XE 10 DataSnap TCP 与 HTTP 比较

    在网络程序开发过程中,面临TCP  HTTP 的选择上往往让人陷入犹豫不决中,http的灵活和较强的穿透能力是TCP无法与之相提并论的,然而在响应速度和处理能力上却能看出后者比前者足够强大的地方.因此 ...

  7. [原创] delphi Memo 滚动到底部/开始 [Delphi XE、Delphi 7]

    以前控制Memo滚动到底部的操作: SendMessage(memo1.Handle,WM_VSCROLL,SB_BOTTOM,0); 或者 Memo1.SelLength:=Length(Memo1 ...

  8. Delphi XE中使用dbExpress连接MySQL数据库疑难问题解决(对三层的例子配置有帮助)

    Delphi IDE中包含一个Data Explorer的组件,如下图所示: 该组件基于dbExpress(包含TSQLConnection.TSQLDataSet.TSQLQuery.TSQLSto ...

  9. Delphi XE中使用dbExpress连接MySQL数据库疑难问题解决

    Delphi IDE中包含一个Data Explorer的组件,如下图所示: 该组件基于dbExpress(包含TSQLConnection.TSQLDataSet.TSQLQuery.TSQLSto ...

随机推荐

  1. Unity---------Particle Effect详情

    Effects:效果/特效. Particle System:粒子系统.可用于创建烟雾.气流.火焰.涟漪等效果. 在Unity3D 3.5版本之后退出了新的shuriken粒子系统:   添加组件之后 ...

  2. ARM mbed平台WIZwiki-W7500使用说明

    ARM mbed IDE 是ARM内核微控制器的在线开发工具,其站点是:http://developer.mbed.org. 站点提供了在线编译器,不须要本地安装编译器就可以进行开发,因此没有地点.时 ...

  3. Win7下Netsh虚拟Wi-Fi

    Netsh的字面意思是网络外壳,其实它是一个命令行实用程序,最初出现于Windows 2000操作系统,它可以帮助管理WINDOWS中的网络设置.此后,微软不断对它进行改进,给它增加了一些新的命令集. ...

  4. HTTP之referer

    安全培训中提到可以通过referer判断安全性,hackbar中也有一个enable referer的选项,则,这个referer到底是个什么角色? (以下是搜集的一些资料整合,链接均放到底部,不再一 ...

  5. ubuntu下gedit和vim输入中文和中文显示

    安装和配置VIM,参考   http://jingyan.baidu.com/album/046a7b3efd165bf9c27fa915.html?picindex=4 在home/你的用户名 这个 ...

  6. js 浅拷贝和深拷贝

    传值与传址 了解了基本数据类型与引用类型的区别之后,我们就应该能明白传值与传址的区别了.在我们进行赋值操作的时候,基本数据类型的赋值(=)是在内存中新开辟一段栈内存,然后再把再将值赋值到新的栈中.例如 ...

  7. C++入门学习

    使用cout和cin,需要包括C++提供的输入输出库.#include <iostream>    标准输入输出头文件 <string>        using namesp ...

  8. The difference between the request time and the current time is too large.阿里云oss上传图片报错

    The difference between the request time and the current time is too large. 阿里云oss上传图片的时候报错如上, 解决办法,把 ...

  9. Windows上使用sqlite3

    安装 去官网http://www.sqlite.org/download.html下载Windows下安装包,下载后,解压,设置环境变量 例如放在D:\sqlite3下,将D:\sqlite3加入环境 ...

  10. Nginx以服务方式启动并用定时任务每天备份日志

    1.安装Nginx以服务方式启动: a.下载 instsrv.exe.srvany.exe 以管理员方式启动CMD执行以下命令: instsrv Nginx D:\nginx\srvany.exe b ...