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

article/2025/9/12 4:19:24

 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;
beginFDQuery1.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文件,无需安装其他驱动、库,无需设置注册等恼人的活动。


http://chatgpt.dhexx.cn/article/nNdgiMW7.shtml

相关文章

FleaPHP的单入口文件详解

在 FleaPHP 应用程序使用 MVC 模式时&#xff0c;应用程序的所有功能都通过一个单一的文件来调用。这种通过单一文件来执行所有功能的应用程序&#xff0c;称为单一入口应用程序。 该文件通常放在程序主目录下。其代码如下所示&#xff1a; Php代码 <?php /** * 入口…

介绍国产的PHP MVC框架:FleaPHP

国产的PHP MVC框架&#xff1a;FleaPHP 官方网站&#xff1a;http://www.fleaphp.org框架下载&#xff1a;http://www.fleaphp.org/download框架API &#xff1a;http://www.fleaphp.org/docs/api/index.html开发指南&#xff1a;http://www.fleaphp.org/guide框架社区&#…

FleaPHP 开发指南 - 7. 数据表关联

数据表关联是指两个或者多个数据表的记录之间的逻辑关系。 例如&#xff1a; 每一个公民都有一个身份证号码 每一位作者都写了多本&#xff08;0-n&#xff09;书籍&#xff0c;而每一本书籍都有多个&#xff08;1-n&#xff09;作者 每一篇文章都有多个&#xff08;0-n&…

FleaPHP 开发指南 - 5. 应用程序设置

FleaPHP 是一个具有高度灵活性的框架。开发者可以用不同的设置来调整 FleaPHP 的工作方式。这些设置统一保存在名为“应用程序设置”的数据源中。 实际上,除了 FleaPHP 框架本身,应用程序也可以使用“应用程序设置”来保存应用程序运行时需要的各种设置。 FleaPHP 的应用程…

FleaPHP 开发指南 - 6. 访问数据库

这一章我们就来看看 FleaPHP 的数据库访问功能。体验一下 FleaPHP 出色的自动化 CRUD 能力。 连接数据库 在 htdocs 目录中创建子目录 testDB&#xff0c;并在子目录下创建文件 test1.php 文件&#xff0c;内容如下&#xff1a; <?phprequire(../FLEA/FLEA.php);__FLEA_P…

FleaPHP 的 Ajax 支持和 WebControls

原文地址&#xff1a; http://www.fleaphp.org/bbs/viewthread.php?tid40 FleaPHP 现在具有了基本的 Ajax 支持&#xff0c;示例代码如下&#xff1a; 首先在控制器显示模版的动作方法中有如下代码&#xff1a; /* * * 显示登录界面 */ function actionIndex() {…

实际采用 FleaPHP 的网站

下面都是采用 FleaPHP 框架开发的网站列表&#xff0c;如果发现无效连接请在留言。 如果你有采用 FleaPHP 开发的网站&#xff0c;并且愿意公开网址&#xff0c;可以发邮件到 dualface (at) gmail.com 需要提供的信息包括网站名称和连接地址&#xff0c;以及简单的介绍文字。…

获取和安装 FleaPHP

目前 FleaPHP 还处于开发中&#xff0c;您应该经常访问该页面&#xff0c;下载最新版本的 FleaPHP&#xff0c;或者通过 Subversion 仓库直接更新本地的 FleaPHP 代码。 FleaPHP 完全版和 FleaPHP runtime 核心合计下载次数已经超过 2000 次。 下载 FleaPHP 如果无法使用 Sub…

关于 FleaPHP

FleaPHP 并不是心血来潮的结果&#xff0c;而是作者在 Web 开发中不断探索的成果。虽然 FleaPHP 缺乏 Zend Framework 那样巨大的号召力&#xff0c;也没有 CakePHP 和 Symfony 那样庞大的社区。但 FleaPHP 仍然是一个值得你花时间去了解、去学习的框架。 FleaPHP 的设计目标 F…

http头部content-type与数据格式

http 头部中的 content-type 和我们传递的数据是息息相关的&#xff0c;不同的取值&#xff0c;服务器解析处理方式不同&#xff0c; 介绍一下几种常见的方式 text/plain&#xff1a;ajax默认方式&#xff0c;将文件设置为纯文本的形式&#xff0c;浏览器在获取到这种文件时…

http 协议中的content-type

content-type可以位于请求头、响应头&#xff0c;分别代表&#xff1a; Request头&#xff1a;请求的与实体对应的MIME信息&#xff08;post请求时的请求体&#xff09;Response头&#xff1a;返回内容的MIME类型 由于http1.0版规定&#xff0c;头信息必须是 ASCII 码类型&am…

contentType的类型及其在上传下载的例子

content-type之上传下载 下载 Content-Type 实体头部用于指示资源的MIME类型&#xff0c;在响应中&#xff0c;Content-Type标头告诉客户端实际返回的内容的类型。 Content-Disposition 是 MIME 协议的扩展&#xff0c;通常用在下载文件时&#xff0c;是下载文件的一个标识字…

Http中Content-Type等属性详解

前言 一直以来对HTTP请求中各种属性一知半解,偶然在博客中找到一篇,特意摘录过来方便自己以后查看. 正文 敬请关注博客&#xff0c;后期不断更新优质博文&#xff0c;谢谢 这里讲解Content-Type的可用值&#xff0c;以及在spring MVC中如何使用它们来映射请求信息。 1. Con…

HTTP首部——Content-Type的作用

前言 对于我们习以为常的东西&#xff0c;却没有仔细思考它的作用。 HTTP的首部都各有个的价值&#xff0c;最近看到这个Content-Type&#xff0c;忽然让我想起来以前自己的一个小小的失误&#xff0c;而产生了一个bug。但是当时却搞得我焦头烂额&#xff0c;我在网络上查找了一…

http(S)系列之(一):概念

参考文章&#xff1a; HTTP & HTTPS网络协议重点总结&#xff08;基于SSL/TLS的握手、TCP/IP协议基础、加密学&#xff09; 一篇比较全的HTTP协议详解 记&#xff1a;千万别误会&#xff0c;本章是完全ctrlc然后ctrlv&#xff0c;知识理解才是最重要&#xff0c;不必要在…

http 协议之 Content-Type

Content-Type 字段是 http 服务端返回给客户端时&#xff0c;head 里面带上的&#xff0c;这个字段表明服务端返回给客户端的 body 是什么类型的&#xff0c;然后客户端就可以根据这个类型进行文件处理。如浏览器客户端&#xff0c;针对 text/html 类型时&#xff0c;是直接显示…

Http中的Content-Type详解

Content-Type Content-Type&#xff08;MediaType&#xff09;&#xff0c;即是Internet Media Type&#xff0c;互联网媒体类型&#xff0c;也叫做MIME类型。在互联网中有成百上千中不同的数据类型&#xff0c;HTTP在传输数据对象时会为他们打上称为MIME的数据格式标签&#x…

HTTP(S)协议详解

1 什么是协议 协议&#xff0c;网络协议的简称&#xff0c;网络协议是通信计算机双方必须共同遵从的一组约定。如怎么样建立连接、怎么样互相识别等。只有遵守这个约定&#xff0c;计算机之间才能相互通信交流。 粗俗理解协议就是 比如你的电脑和我的电脑要通信&#xff0c;&a…

详解Http的Content-Type

目录 1.概述 2.常用类型 2.1.application/x-www-form-urllencoded 2.2.application/json 3.Spring MVC支持的编码 3.1.实验 3.2.适配器 3.3.自定义适配器 1.概述 HTTP&#xff08;HyperText Transfer Protocol&#xff09;&#xff0c;超文本传输协议。超文本&#xf…

Http协议之Content-Type理解

Content-Type&#xff0c;翻译过来就是”内容类型“&#xff0c;在互联网中就是”互联网媒体类型“。 在互联网中&#xff0c;两台计算机经常会传输数据&#xff0c;客户端会给服务器发数据&#xff0c;服务器也会给客户端发数据。数据的类型也是有很多种的&#xff0c;我们把所…