# XE11-DataSnap-Beginner **Repository Path**: ACTUL/XE11_DataSnap_Beginner ## Basic Information - **Project Name**: XE11-DataSnap-Beginner - **Description**: 这是基于Delphi XE11.1版本,DataSnap方面的初学者代码示范。演示的功能是DataSnap Server + DataSnap Client 结合起来访问Northwind数据库。工程组包含服务端及客户端。 工程参照DataSnap 2010白皮书的例子编 写,为了让练习者容易操作重现,控件名称完全按IDE自动生成时的标识。 - **Primary Language**: Delphi - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-06-18 - **Last Updated**: 2022-06-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # XE11-DataSnap-Beginner #### 介绍 这是基于Delphi XE11.1版本,DataSnap方面的初学者代码示范。演示的功能是DataSnap Server + DataSnap Client 结合起来访问Northwind数据库。工程组包含服务端及客户端。 工程参照DataSnap 2010白皮书的例子编 写,为了让练习者容易操作重现,控件名称完全按IDE自动生成时的标识。 #### 软件架构 Delphi XE系列自2010年发行以来已经十多年过去了,到2021年版本升到XE11。过去在试用这些版本当中,总是觉得有一些问题。 它的版本升级很频繁,但BUG的修复跟不上。对于我来说兴趣度一直提不起来,只是在某个大版本出来后才关注一下。 关于Delphi XE系列方面的参考资料非常之少,新手在这方面的学习难度是非常大的,因此Delphi生态也越来越冷了。 我在2022年留意到XE11.1发布,于是决定花一些时间去尝试体验一下这个版本的特性,所关注的主要方面是数据库应用功能方面的开发特性。 本人对于一些实用的功能框架,以显浅的代码风格做出例子后,就放到公开仓库上。希望对Delphi XE的初学者有帮助。 本项目是一个入门级示例,服务端是VCL Application类型的DataSnap Server,服务端使用的控件类有: TDataModule,TDSServer,TDSTCPServerTransport,TDSHTTPService,TDSAuthenticationManager,TDSServerClass; 数据访问控件类有:TADOConnection,TADOQuery,TDataSetProvider。 客户端是VCL Application,使用的控件类有:TSQLConnection,TDSAdminClient,TDSProviderConnection,TClientDataSet,TDataSource,TDBGrid。 #### 安装教程 1. Prepare the database with NorthWind. Be sure the local SQL Server is installed ready, and the Northwind database is crreated. Use the scripts in db/NorthWind/*.sql, execute them in a new query from in SQL Server Management Studio . After that, the tables and data will be created and filled in the NorthWind. 使用NorthWind准备数据库。确保本地SQL Server已安装就绪,并且已创建Northwind数据库。 使用db/NorthWind/*.sql中的脚本,在sql Server Management Studio中的新查询中执行它们。 之后,将在NorthWind中创建并填写表格和数据。 2. 编写代码过程 (1)启动Delphi XE11+ (任意版本,Community也行)。这里的项目是较为基础的,没有用到高级的特性。 (2)File -> New -> Other -> Delphi -> DataSnap -> DataSnap Server -> OK. (2.1)在New DataSnap Server页,Platform (平台):不选择Linux, [Next]。 (2.2)在New DataSnap Server页,Project type (项目类型):选择 Forms Application, [Next]。 (2.3)在New DataSnap Server页,Application type (应用类型):选择 VCL application, [Next]。 (2.4)在New DataSnap Server页,Server Features (服务功能): 选上[v]Protocols(协议),选上[v]TCP/IP,[v]HTTP; 选上[v]Authentication(身份验证),选上[v]Authorization(授权); 下面其余项不选, [Next]。 (2.5)在New DataSnap Server页,Port Numbers (端口号): TCP/IP Port: 211; HTTP Port: 8080; 若无特殊冲突,选用上述默认值即可, [Next]。 (2.6)在New DataSnap Server页,Server methods ancestor class (服务器方法祖先类): 选择第3项 TDSServerModule , [Finish]。 (3)File -> Save Project As...;将项目另存到 DataSnap_Beginner/DSServer/目录中。 (3.1)在ServerMethodsUnit1的[Design]视图(即Form界面,点右下的[Design])上, 从控件面板[Palette]找到[dbGo]节,放置TADOConnection,TADOQuery 两个控件上去; 从控件面板[Palette]找到[Data Access]节,放置TDataSetProvider控件上去; (3.2)TADOConnection(ADOConnection1),属性设为False,属性设为(本机的NorthWind,由操作系统认证): Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=Northwind;Data Source=localhost (3.3)TADOQuery(ADOQuery1),属性设为ADOConnection1,SQL语句设置为: SELECT * FROM Categories (3.4)TDataSetProvider(DataSetProvider1),属性设为ADOQuery1; (4)在项目浏览框,选中[ProjectGroup1],[Save ProjectGroup As...],保存项目组到 DataSnap_Beginner/ 目录中。 (5)在项目浏览框,选中Project1.exe,右键:[Build](或菜单:Project -> Build Project1); 选中Project1.exe,右键:Run without Debugging,即服务端程序就运行起来了。 (6)在项目浏览框,选中[ProjectGroup1],[Add New Project...],下面创建客户端程序; 选择[Delphi] -> [Windows VCL Application] -> OK。这时新建了项目Project2。 将项目Project2保存到DataSnap_Beginner/DSClient/目录中。下面接着放控件。 (6.1)在Form2上放置控件(dbExpress)TSQLConnection; TSQLConnection(SQLConnection1),属性设为False, TSQLConnection(SQLConnection1),属性选择DataSnap,按默认参数即可; (6.2)在Form2上放置控件(DataSnap Client)TDSProviderConnection; TDSProviderConnection(DSProviderConnection1),属性设为SQLConnection1, TDSProviderConnection(DSProviderConnection1),属性不能选,手工输入TServerMethods1, 这个“TServerMethods1”是服务端的方法模块类名,客户端DSProviderConnection1将连接到这个方法模块。 (6.3)在Form2上放置控件(Data Access)TClientDataSet; TClientDataSet(ClientDataSet1),属性设为DSProviderConnection1; TClientDataSet(ClientDataSet1),属性可以选择(在Project1.exe服务运行时),设为DataSetProvider1(也只看到这一个); (6.4)在Form2上放置控件(Data Access)TDataSource; TDataSource(DataSource1),属性设为ClientDataSet1; (6.5)在Form2上放置控件(Data Controls)TDBGrid; TDBGrid(DBGrid1),属性设为DataSource1; (6.6)在Form2上放置控件(Standard)TButton,三个按钮Button1,Button2,Button3,Button4,Button5; 按钮的Caption分别设为"connect","disconn","open cd1","save cd1","close cd1" 在些按钮的点击事件中,分别写上相应功能代码,内容如下: ``` procedure TForm2.Button1Click(Sender: TObject); begin SQLConnection1.Open; end; procedure TForm2.Button2Click(Sender: TObject); begin SQLConnection1.Close; end; procedure TForm2.Button3Click(Sender: TObject); begin ClientDataSet1.Active:=True; end; procedure TForm2.Button4Click(Sender: TObject); begin if ClientDataSet1.ChangeCount>0 then ClientDataSet1.ApplyUpdates(-1); end; procedure TForm2.Button5Click(Sender: TObject); begin ClientDataSet1.Active:=False; end; ``` (6.7)TSQLConnection(SQLConnection1),属性设为False,保存Project2所有文件;编译/构建项目。 (6.8)试运行Project2.exe,点[connect]正常,点[open cds1]可能会报错: Project Project2.exe raised exception class TDBXError with message 'Remote error: Error loading MIDAS.DLL'. 先关闭Project2.exe,Project1.exe。下面查错改进。 (6.9)原因通常是在Windows 64位下,Delphi XE的IDE(BDS.exe)是运行在32位模式,而Midas.dll注册到系统的是在windows/sysWOW64中,是64位的。 如果能将Midas.dll的32位注册到windows/system32中,则就与开发环境相匹配,这样在界面上触发Midas是就不会有版本冲突。 可惜我的电脑是win7 X64位,注册Midas.DLL的32位版本时会卡死,于是就放弃了32位版本的注册。 只好在程序中uses MidasLib,将Midas编译到程序中。 通过项目View Source,在Project1.dpr和Project2.dpr中的uses加入MidasLib,重新编译,运行,则前面的各项功能正常。 (7)客户端增加远程方法调用功能 保持Project1.exe服务端运行,关闭程序Project2.exe。 在Project2的Form2上,点中SQLConnection1,右键-> [Generate Datasnap client classes]。 即生成TServerMethods1对应的客户端的类TServerMethods1Client,单元名称为Unit3,不改名,直接保存。 (7.1)在Form2上放置2个TButton控件,为Button6,Button7,Caption分别改为"Call Func1","Call Func2"。 加入事件处理代码如下: ``` procedure TForm2.Button6Click(Sender: TObject); var Server: TServerMethods1Client; begin Server := TServerMethods1Client.Create(SQLConnection1.DBXConnection); try ShowMessage(Server.EchoString('Hello Test.')) finally Server.Free end; end; procedure TForm2.Button7Click(Sender: TObject); var Server: TServerMethods1Client; begin Server := TServerMethods1Client.Create(SQLConnection1.DBXConnection); try ShowMessage(Server.ReverseString('Hello Test.')) finally Server.Free end; end; ``` (7.2)若发现TServerMethods1Client不能识别,需让Unit2单元uses Unit3单元。 (7.3)TSQLConnection(SQLConnection1),属性设为False,保存Project2。 (7.4)编译,运行Project2.exe,先点[connect]连接服务端,再点[Call Func1]、[Call Func2],程序应能达到预期。 3. 综述 Delphi XE系列版本,带来了许多功能特性,包括移动端开发的环境等。 增加了不少的类型,如“Muti-Device Application”多设备应用,包括: FireMonkey Application Platform 64-bit Windows Application macOS Application Android Mobile Application iOS Mobile Application 里面用的控件是FireMonkey架构,它的特性与用法,与VCL架构是有很大区别的。 对于初学者,以“Windws VCL Application”传统桌面应用,作为入门应用的练演项目,将会降低难度。 本案例是一个简单的三层架构应用,主要演示了数据库的连接,服务端与客户端的实现。 #### 使用说明 1. xxxx 2. xxxx 3. xxxx #### 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request #### 特技 1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md 2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) 3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) 6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)