BCB开发MIDAS(DataSnap)多层应用程序

彻底解决Delphi/C++Builder程序缺少VCL60.bpl运行时错误 在Windows软件开发中,动态链接库(DLL)是模块化编程和代码复用的核心技术,它允许程序在运行时加载共享的函数库,从而减小可执行文件体积并便于更新。然而,这种动态依赖也带来了部署难题,即目标系统若缺少特定DLL,程序将无法启动。Delphi/C++Builder平台特有的Borland包库(BPL)正是这种机制的延伸,专用于承载其可视化组件库(VCL)。当开发者使用“带运行时包编译”选项时,程序便依赖于如VCL60.bpl等外部文件。其技术价值在于实现组件共享和模块化更新,但代价是产生了外部依赖,这在程 阅读详情

BCB开发MIDAS(DataSnap)多层应用程序

作者: vrknights 日期: 2012 年 2 月 11 日

 

很多时候我们需要编制这样的程序,即多个客户端访问并操作服务器上的数据库中的数据。若你想使用的方式不是WEB网站,则通常我们可以有两种方式,1.客户端直接连接远程数据库,登录并操作数据。2.客户端不能直接连接远程数据库,而是连接到远程服务器上的服务端程序,将需要进行的操作以指令形式发送给服务端以实现操作数据.
第一种,业务逻辑全部位于客户端程序中,一则不够安全,二则不利于业务逻辑的变更。举一个非常简单的例子,V1.0的程序有注册功能,可以保存用户名、密码、个人资料等信息。但如果这时你需要为程序增加一个“注册时间”的字段,你就需要升级所有的客户端程序,以修改操作数据库的关键性SQL语句。
第二种,业务逻辑可位于中间服务端程序中,客户端仅仅负责提交申请和数据,使业务更加安全,同时也利于逻辑的变更。仍依上例,客户端将用户填写的数据打包,调用服务端的远程方法AddUser(MyPackget *)。而这时你仅仅需要修改服务端程序中的“AddUser(MyPackget*)”函数内的SQL即可。
第二种实现方式即典型的三层应用体系结构。这种体系不仅实现了“瘦”客户端,同时也可以很方便的实现分布式,你可以将服务器分成多个登录服务器及应用服务器,根据当前服务器承载状态实现负载均衡。
MIDAS即多层应用体系结构的关键技术。在Borland C++ Builder中,提供了DataSnap组件组,可以很简单的实现多层应用体系。下面就来操作一下,简单实现一下多层体系Client和Server的函数调用和消息传递。
服务端方面:
1.在你的工作文件夹下,创建好Server目录和Client目录.
2.打开BCB,选择新建应用程序(Application),点击保存,将窗体文件保存为MyServerFrm.cpp,将工作文件保存为MyServerPrj.cpp。当然,你也可以另取名称。
3.在窗体Form1上拖入一个文本组件Memo1,这个文本组件将用于显示客户端传递过来的消息。
4.菜单上选择 新建(New)->其他(Other)->多层(Muilter),选择其中的”远程数据模块”(Remote Data Module),在类名”CoClass Name”中填入”MyRDM”(你也可以另取名称,但在后面如有用到MyRDM的,请使用你自己的名称替代。),线程模式(Threading Model)保持Apartment不变。点击确定(Ok)。将数据模块保存为MyRDMImpl.cpp
5.打开查看(View)->类型库(Classes Libary,英文界面是不是显示这个?我的界面是中文版的),在其中的IMyRDM上点击右键,选择New->Method新建一个方法。
6.将该方法命名为”SayHello”。在Parameters中,添加两个参数。一个是消息内容,Name是strSay,类型是BSTR,方式是:in
另外一个是返回值,Name是nOk,类型是:int*,方式是:out,RetVal
如图:类型库

7.点击类型库上方的刷新按钮,在新显示的代码框中输入如下代码:

1STDMETHODIMP TMyRDMImpl::SayHello(BSTR strSay, int* nOk)
2{
3    AnsiString str=AnsiString(strSay);
4    AnsiString strOutput=AnsiString("客户端输入的是: ") +str;
5    Form1->Memo1->Lines->Add(strOutput);
6    if(str.AnsiCompare("OK")==0){
7  
8       *nOk=1;
9    }else{
10       *nOk=0;
11    }
12}

并在SayHello函数所在的文件中添加头文件,#include “MyServerFrm.h” (否则会Form1未定义)
8.执行一下程序,使之在系统中注册。以便客户端远程连接。
9.在你的BCB安装文件夹下的BIN目录中,找到scksrvr.exe程序,运行之。

客户端:
1.新建一个应用程序,将主窗体保存为:MyClientFrm.cpp,将工程文件保存为:MyClientPrj.cpp
2.点击工程(Project)->添加到工程(Add to project),将Server目录下的MyRDM_TLB.cpp添加到工程中。
3.文件->新建(New)->数据模块(Data Module),创建一个数据模块,将文件保存为MyDataModule1.cpp.
4.向数据模块窗体中,拖入DataSnap组件组中的SocketConnection组件。并将SocketConnection1的Address为127.0.0.1(即本机),SocketConnection1->ServerName找到XXX.MyRDM,GUID会根据ServerName自动获取。端口保持211不变(除非你在scksrvr.exe中更改过端口)。并且,注意将SocketConnection1->Active改成True。此时,如果正常的话,服务端程序如未开启,将会自动 运行。
5.向主窗体Form1中添加 一个Edit1和一个按钮Button1,双击Button1,在Button1Click事件中输入如下代码:

1void __fastcall TForm1::Button1Click(TObject *Sender)
2{
3      int nOk=-1;
4      WideString wsSay=Form1->Edit1->Text;
5     IDispatch* disp = (IDispatch *)DataModule1->SocketConnection1->AppServer;
6     IMyRDMDisp TheRDM((IMyRDM*)disp);
7     nOk=TheRDM.SayHello(wsSay);
8     if(nOk==-1){
9        ShowMessage("执行出现错误");
10     }else if(nOk==0){
11        ShowMessage("Edit1中输入的不是OK");
12     }else if(nOk==1){
13        ShowMessage("Edit1中输入的是OK");
14     }else{
15        ShowMessage("未知错误");
16     }
17}

并在Button1Click所在的文件中添加头文件:#include “MyRDM_TLB.cpp” 和#include “MyDataModule.cpp”
6.运行之。并尝试在Edit1中输入不同的值 ,以观察结果。
如图所示:Client和Server通信

至此,一个简单的MIDAS结构就完成了。为了完善它,你只需要在Server端->MyRDM(远程数据模块)中添加ADOConnection、ADOQuery、DatasetProvider、ADOTable等数据库组件连接并操作数据库,即可实现三层体系结构。
对了,最后忘了一点没有说。Apartment模式下的Remote Data Module 远程数据模块的工作状态是这样的,在Server程序开始运行时,即创建第一个RDM,用于接受Client端的连接请求。当Server端和Client端正式连接上时,SERVER端会新建一个Remote Data Module,以接受新的客户端连接请求。所以,每一个客户端,都会有自己独立、私有的的一个Remote Data Module.
那么,问题来了。当你需要调用RDM的其他成员(如ADOQuery)时,需要使用m_DataModule以指定操作自己私有的远程数据模块。即应该用:m_DataModule->ADOQuery1->SQL->Add(“select count(1) from users where username=:username and password=:password”); 而非TMyRDMImpl::ADOQuery1->SQL->Add(…)
切切,话说当年本人为此也付出不菲的时间代价。

35、开发 DataSnap 应用程序:从基础连接到 Web 客户端实现 本文深入介绍了使用C++Builder开发DataSnap应用程序的完整流程,涵盖客户端与服务器的基础连接(套接字和DCOM)、数据更新与错误协调机制、Web客户端实现(TXMLBroker与TInetXPageProducer组件应用),并通过流程图、对比表格及实际案例帮助开发者掌握多层架构的设计与开发技巧。 阅读详情

相关推荐

基于C++Builder的DataSnap分布式数据库应用开发实战

在现代分布式应用开发中,C++Builder凭借其强大的VCL和FMX框架支持,成为构建高性能跨平台客户端/服务器系统的优选工具。而DataSnap作为C++Builder内置的远程调用(RPC)架构,提供了完整的Web服务解决方案,能够实现数据服务的快速发布与消费。本章将深入解析DataSnap的核心设计理念及其在C++Builder环境中的角色定位,涵盖RESTful服务机制、JSON数据交换格式、多协议通信支持(HTTP/TCP)以及基于组件化的服务封装方式。

weixin_29363791的博客 486

Delphi XE程序设计系列 2-开发DataSnap/REST服务器

<br /><br /><br />    在上次的文章中讨论了如何把传统的Delphi 主从架构应用程序逐渐转换为DataSnap JSON服务器,在本篇文章中让我们正式讨论如何使用Delphi XE开发DataSnap/REST服务器,由于这其中牵涉到非常多的技术,因此我们将花数篇的篇幅来讨论。现在就让我们从DataSnap/REST服务器开始。<br /><br />开发DataSnap服务器<br /><br />    Delphi XE版的DataSnap允许开发人员同时在DataSnap服务器

编程资料收集与共享交流 3840

DataSnap REST C++版

DataSnap REST C++PDF版 DataSnap REST 使用方法教程

BCB、delphi 三层结构简易教程

转的一篇delphi的教程,原文地址:点击打开链接 经实际测试,有更改。所谓三层:(1) 客户端(2) 服务器端(3) 数据库    在数据访问时,使得客户端必须通过服务器来访问数据库。提高了系统的安全性。    在BCB6中可以使用Socket或者Dcom来连接他们相互间的通讯

天道酬勤 2145

C++Builder开发的数据采集系统上层应用软件

含有全部工程文件,使用C++ Builder 6.0完成开发,可重新编译运行。创作权归曹润泽所有,使用者不可用于商业目的,否者后果自负。 本软件功能: 上层的应用软件的模块主要有:初始化模块、用户设置模块、COM串行通信数据采集模块、数据矫正模块、数据绘图模块、数据存储模块、网络传输模块、功能整合模块等。其中网络传输模块又可以根据工作模式分为服务端网络传输模块和客户端网络传输模块。 用户设置模块:主要是通过用户设置设置窗口中的信息来完成软件的设置,这些可以设置的变量都非常重要,包括基本设置:采样频率设置、COM端口选择、警告限设置(是否使用警戒限、高警戒限的大小、低警戒限的大小)、矫正表设置(是否使用矫正表、选择矫正表);绘图设置:显示点数设置、曲线宽度设置、曲线颜色设置(高警戒曲线的颜色、正常时曲线颜色、低警戒曲线的颜色设置);网络设置:是否使用网络传输、网络基本设置(服务端选择、客户端选择、端口号设置、服务端IP设置)。 COM串行通信数据采集模块:用于从串行口中读取数据。 本系统使用专门用于RS-232串行通信通信控制的控件TComm控件来完成COM通信。 数据矫正模块,顾名思义,是用于对数据进行矫正的。若需要矫正数据,必须使用矫正表,矫正表实际上只是个用户可自定义的文本文件,但在编写矫正表文件时必须按照一定规则进行编写。 数据绘图模块:对于采集数据的实时绘图是通过Borland C++ Builder 6.0自带的功能强大的TChart控件来实现。 数据存储模块:该模块除了使用了编译器所提供的几个基本数据类型之外,基本上是使用纯C++编写(不使用编译器的控件)。数据存储并未使用数据库存储,而是使用文本文件的方式对所有采集到的时间进行存储,存储时要先把采样信息写入到数据文件的头部,包括创建时间、采样起始时间、采样持续时间、采样结束时间、采样频率、采样数等等信息,之后就是所采集的数据,采样数据包括数值和采集的该点所对应的时间,以及该点是否被警告(过低用!Low表示、正常用-表示、过高用!High表示)。 网络传输模块:网络传输模块是本数据采集系统比较新颖的模块,可以使用互联网进行速率较低的数据传输,考虑到网络传输的延迟,故设计时设置的采样速率比较低。网络传输模块实际上是使用Socket编程实现的,在Borland C++ Builder中有封装好的用于网络通信的控件:TServerSocket和TClientSocket。

C++Builder DataSnap程序

cb2010_DataSnap_demo 从服务端的 access数据库读取数据到客户端,在C++Building2010下编译通过

DataSnap 连接池 DSServer1Disconnect

DataSnap Server DSServer1Disconnect 这个函数什么时候执行? void __fastcall TServerContainer1::DSServer1Disconnect(TDSConnectEventObject *DSConnectEventObject) 客户端正常退出的时候,会执行,SQLConnection1->Close(); 如果客户...

weixin_30817749的博客 872

OFDM基本原理

OFDM基础介绍,包括OFDM的核心思想,数学推导了OFDM信号的调制解调过程。

伊丽莎白的学习之路 8910

C++Bulder DataSnap 内存泄露元凶

DSServerClass1 DSServerClass1DestroyInstance void __fastcall TServerContainer1::DSServerClass1DestroyInstance(TDSDestroyInstanceEventObject *DSDestroyInstanceEventObject) { ; }  c++builder...

weixin_34125592的博客 213

linux操作系统使用以太网连接ubuntu,设置固定ipv4

首先,您需要确定要配置的网络接口。可以使用ifconfig -a或ip addr命令来列出当前系统上的所有网络接口及其相关信息。找到您要配置的网络接口名称,例如eth0、ens33或enp0s3;保存并关闭文件后,您需要重启网络服务以使更改生效。在linux操作系统中,要使用交换机连接以太网可以直接使用交互界面;如果你的操作系统没有交互界面,你可以使用命令方式配置;点击ipv4,方式为手动,可以设置ip和子网了;开头,后接网络接口名称。第三步:点击有线最右边圆形控件;第二步:点击有线设置;

2301_79311842的博客 2404

C# 原生数字孪生的尝试

本文介绍了使用C#实现数字孪生的基本思路。首先从爱普生官网下载机器人3D模型,然后通过Blender创建并导出带动画的FBX模型。在WPF项目中,使用HelixToolkit.SharpDX等插件加载模型,通过Viewport3DX进行3D渲染。关键点是通过动画控制器接收真实设备信号来驱动模型动画,实现物理实体与虚拟模型的同步。文中提供了完整的代码实现,包括模型导入、动画播放控制等核心功能。该方法为构建数字孪生系统提供了一种可行的技术方案。

qq_33529095的博客 1333

C++ Builder 6 进行 SOAP 开发(2) -- 通过 SOAP 传递自定义类型数据

C++ Builder 6 BizSnap/SOAP/WebService(2) -- 通过 SOAP 传递自定义类型数据    本文将做一个略复杂的例子,实现通过 SOAP 传递自定义的数据类型。本例子的功能是在服务端通过 dbExpress 的数据访问控件取得数据表内容,然后将其通过 SOAP 传递到客户端再显示。    服务端: 1.New|WebSe

猛禽的编程艺术 5059

液冷方式介绍

如果将直径在1~100nm的颗粒悬置在传热流体(例如:水、乙烯、乙二醇等)中时,其传热能力会得到提升,因为大多数固体材料的热导率要大于液体,因此由颗粒、流体组成的混合物热导率也高于液体本身的热导率,由此制成的流体,我们称之为纳米流体。金属冷管的液体工质蒸散量几乎为0,而柔软材质的管道则会产生液体的蒸散,在封闭式循环系统中,为了弥补液体工质的蒸散,必须定期在系统中补充液体工质。——我们之前说过,材料的导电和导热的机制大致是类似的,所以导电能力更强的金属往往具有更好的导热能力。

制冷技术咨询与服务的博客 2041

从 MIDAS 到 DataSnap

 从 MIDAS 到 DataSnap从 MIDAS 到 DataSnap 在 Borland 刚刚发布的新产品 Delphi 6 中,原来在 Delphi 5 中的 MIDAS 被改称为 DataSnap 。 Borland 为什么要把 MIDAS 改名呢?我想如果不是 Borland 对 MIDAS 做了(或即将做)很大的改动,她没有必要把 MIDAS 改名, 虽然然市场宣传的需要也

1598

PostgreSQL高可用之主备复制

多个PostgreSQL可协同工作,如果主库发生宕机备库将迅速进行接管并对外提供服务以实现高可用。本文将从主备复制、主备切换、故障转移等角度进行实际测试演练。第一章主备复制是基础,通过主备复制可以得到一个或多个相同的实例。在主备复制的基础上通过第二章主备切换介绍了如何手工将主库与备库互换角色。在第三章中,采用了Keepalived进行实时监测,在主库宕机后,使用主备切换中提到的命令使备库升级为主库并对外提供服务,以达到PostgreSQL高可用的目标。

asdasdsaff的博客 1348

Qwen2.5-VL多模态微调超参数深度解析(上):训练流程与优化策略的量化机制分析

上篇文章通过系统化的对比实验,回答了多模态微调中的三个基础问题:“选什么方法”(LoRA/Full/Freeze/OFT对比)、“用什么配置”(60+组超参数组合)、“达到什么效果”(ROUGE-L/BLEU-4指标)。这些结果为后续工作奠定了实验基线,但也留下了更深层的疑问:为何相同方法在不同数据集上表现迥异?为何某些超参数的微小调整会引发性能剧变?如何在未见过的任务上快速找到最优配置?本文是对前文实验数据的二次挖掘与机理解析。我们将关注点从"做了什么实验"转移到"实验揭示了什么规律",实验视角从"结果对

羊城迷鹿的博客 1005

Delphi2010中DataSnap高级技术(2)—DataSnap服务端和客户端发布分发方法

这几天继续研究DataSnap技术。 针对服务器和客户端软件,如何发布呢?经过研究发现,分发方法非常简单! 服务器发布方法: 1.在unit ServerMethodsUnit1单元中,添加uses MidasLib;(添加MidasLib的目的是省去发布Midas.dll) 2.我用的是火鸟数据库,只需拷贝dbxfb.dll和fbclient.dll 分发的服务器软件只需三个文件:你的...

v5qqcom 170

BART non-Cartesian 重建:并行成像 压缩感知

本文主要使用并行成像和压缩感知方法实现non-Cartesian MRI 数据的重建。

张哥频道:电生理信号和磁共振成像 1182

Borland DataSnap(MIDAS)三层架构中,常用事件及其触发顺序(转)

1、 知道事件触发顺序的重要性和必要性 实现一项功能通常要做两件事:a)首先要知道在哪里控制;b)其次要知道如何控制。 然而,很多情况下都是我们已经知道怎么去控制,但不知道控制点选在哪里。这主要是因为我们对组件事件的触发顺序搞不清楚。 2、 要深刻理解TclientDataSet的两个重要属性:Data、Delta 3、...

a7129691的博客 247

基于SAGE算法的宽带信道参数估计算法的MATLAB仿真

本文将介绍如何使用MATLAB进行SAGE算法的仿真,以便更好地理解和应用该算法。SAGE算法是一种基于最大期望(Expectation-Maximization)方法的迭代估计算法,用于估计未知的参数。在宽带信道参数估计中,SAGE算法通过迭代优化来估计信道的传输函数。总结起来,本文介绍了如何使用MATLAB进行基于SAGE算法的宽带信道参数提取算法的仿真。通过以上步骤,我们可以得到估计的信道响应,并与真实信道响应进行比较。此外,SAGE算法还可以与其他信道估计算法相结合,以提高估计的准确性和性能。

CodeRoarX的博客 1075

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

C++ Builder文件任意分割传输技术

文档管理软件,文档管理系统,知识管理系统,档案管理系统的技术资料: [摘要] 本文详细介绍了应用C++builder把文件任意分割成若干个小块在网络上发送并在终端上接收,重新组装成原文件的技术。   一. 前言   目前网络编程技术有很多,一般都是直接利用编程软件自带的功能函数或控件来完成,用户不必关心低层的操作,确实带来方便。但灵活性不够,如果要传输的文件比较大,则速度慢。如果网络的断线率高,...

wiss66的专栏 576

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

论DATASNAP结合FIREDAC的使用方法

论DATASNAP结合FIREDAC的使用方法 自DELPHI XE5开始引入FIREDAC数据引擎以来,FIREDAC就正式成为了官方的数据引擎。一直到XE10.1 UPDATE1,据笔者观察,FIREDAC都是新版本开发当中的重中之重,其在DELPHI的地位自然是不言而喻。 DATASNAP结合FIREDAC,中间件远程方法支持的数据序列格式可谓是丰富多彩。已经不仅仅是只支持OLEVARI...

weixin_30514745的博客 529

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

MIDAS中动态强制约束编程,一个用来区分 MIDAS 与其他分布式数据库解决方案的特征

  MIDAS中动态强制约束编程   作者:zou5655 时间:2001-11-01 10:40 出处:互联网 责编:My FAQ

yethyeth的专栏 1196

如何让中间层MIDAS/DATASNAP支持大量的并发用户并且控制连接数量

最近在写一个基于XE2 DATASNAP的中间层,以前也写过基于DCOM的MIDAS中间层,看到网上一些同仁对中间层的提问。我摘录俩个典型的提问,如下: 第一个提问: Midas三层程序,如何支持大量用户同时请求连接?系统结构: TClientDataSet -> TSocketServer -> scktsrvr.exe -> RemoteDataModule -> ...

weixin_30617737的博客 367

BCB6 使用TClientDataset范例

使用步骤, 1.创建字段。

云魂工作室-AKAI 1642
上一篇: vs2010 自带的 SQLEXPRESS2008 的几个问题
下一篇: 测试SQL网络
Persistent8813
博客等级 码龄23年 7粉丝 4原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值