在datasnap 中使用unidac 访问数据(服务器端)

摘要:
自delphi6以来,作为delphi的内置多层框架,datasnap已经更新到最新的delphi10.3。今天,我们将简要介绍如何使用unidac访问datasnap中的数据库。首先,按照向导生成标准数据捕捉服务器。我们可以通过以下代码设置主界面代码:procedureTinf。btStart单击;beginifnotServerContainer1.DSServer1.StartedthenbeginServerContainer1.DSTCPServerTransport1.Port:=StrToInt;ServerContainer1.DSHTTPService1.DSPort:=StrToInt;ServerContainer1.DSServer1.Start;mStatus.Lines。添加ServerContainer1.DHTTPService1.Start;mStatus.Lines。添加BtStart。标题:=“停止”;endelsebeginServerContainer1.DHTTPService1.Stop;mStatus.Lines。添加ServerContainer1.DSServer1.Stop;mStatus.Lines。添加BtStart。标题:=“开始”;终止终止过程TServerContainer1.DSServer1Connect;varci:TDBXClientInfo;beginci:=DSConnectEventObject.ChannelInfo。客户信息;mainf.mStatus.Lines。添加终止过程TServerContainer1.DSServer1断开连接;varci:TDBXClientInfo;beginci:=DSConnectEventObject.ChannelInfo。客户信息;mainf.mStatus.Lines。添加终止上述数据捕捉服务器已基本设置。现在我们需要添加数据库访问功能。

从delphi 6 开始,datasnap 作为delphi 自带的多层框架,一直更新到最新的delphi 10.3 。同时逐步增加了很多新的功能

,比如支持REST 调用,支持 IIS ,apache 等服务器。今天简单介绍一下如何在datasnap 中使用unidac 访问数据库。

首先,按照向导生成一个标准的datasnap 服务器。

在datasnap 中使用unidac 访问数据(服务器端)第1张

在datasnap 中使用unidac 访问数据(服务器端)第2张

在datasnap 中使用unidac 访问数据(服务器端)第3张

在datasnap 中使用unidac 访问数据(服务器端)第4张

在datasnap 中使用unidac 访问数据(服务器端)第5张

在datasnap 中使用unidac 访问数据(服务器端)第6张

在datasnap 中使用unidac 访问数据(服务器端)第7张

在datasnap 中使用unidac 访问数据(服务器端)第8张

点完成就自动生成对应的工程文件

在datasnap 中使用unidac 访问数据(服务器端)第9张

 在datasnap 中使用unidac 访问数据(服务器端)第10张

其中

  • DSServer — 用来控制数据c传输和服务类;
  • DSServerClass — 用来定义可供客户端调用的服务器类方法;
  • DSHTTPService — 用来使用HTTP 协议访问服务器;
  • DSAuthenticationManager —控制调用服务器方法的用户认证及授权;
  • DSTCPServerTransport — 用来使用TCP/IP访问服务器。

我们可以通过代码做一些对应的设置

主界面代码:

procedure Tmainf.btStartClick(Sender: TObject);
begin
 if not ServerContainer1.DSServer1.Started then
  begin
    ServerContainer1.DSTCPServerTransport1.Port := StrToInt(edTCPIPPort.Text);
    ServerContainer1.DSHTTPService1.DSPort      := StrToInt(edHTTPPort.Text);
    ServerContainer1.DSServer1.Start;
    mStatus.Lines.Add( Formatdatetime('yyyy-mm-dd hh:nn:ss',now) + 'TCP/IP 启动侦听');
    ServerContainer1.DSHTTPService1.Start;
    mStatus.Lines.Add(Formatdatetime('yyyy-mm-dd hh:nn:ss',now) +'HTTP 启动侦听');
    btStart.Caption := '停止';
  end
  else
  begin
    ServerContainer1.DSHTTPService1.Stop;
    mStatus.Lines.Add(Formatdatetime('yyyy-mm-dd hh:nn:ss',now) + 'TCP/IP 停止侦听');
    ServerContainer1.DSServer1.Stop;
    mStatus.Lines.Add(Formatdatetime('yyyy-mm-dd hh:nn:ss',now) +'HTTP 停止侦听');
    btStart.Caption := '启动';
  end;
end;
procedure TServerContainer1.DSServer1Connect(
  DSConnectEventObject: TDSConnectEventObject);
var
  ci: TDBXClientInfo;
begin
  ci := DSConnectEventObject.ChannelInfo.ClientInfo;
  mainf.mStatus.Lines.Add(Format('客户端以 %s 方式连接 IP: %s, 端口: %s', [ci.Protocol, ci.IpAddress, ci.ClientPort]));

end;

procedure TServerContainer1.DSServer1Disconnect(
  DSConnectEventObject: TDSConnectEventObject);

var
  ci: TDBXClientInfo;
begin
  ci := DSConnectEventObject.ChannelInfo.ClientInfo;
  mainf.mStatus.Lines.Add(Format('客户端以 %s 方式断开 IP: %s, Port: %s', [ci.Protocol, ci.IpAddress, ci.ClientPort]));
end;

以上datasnap 服务器端基本上就设置好了,现在我们要增加数据库访问功能。数据库访问控件毫无疑问,使用unidac.

本次还是以postgresql 为例。

启动postgresql 服务器

在datasnap 中使用unidac 访问数据(服务器端)第11张

(这个服务器在哪里下载?请猛戳 www.haosql.com).

 运行数据库脚本

CREATE TABLE dept
(
  deptno serial NOT NULL,
  dname character varying(14),
  loc character varying(13),
  cnt integer,
  CONSTRAINT "PK_MASTER" PRIMARY KEY (deptno)
);
 
CREATE TABLE emp
(
  empno serial NOT NULL,
  ename character varying(10),
  job character varying(9),
  mgr integer,
  hiredate timestamp without time zone,
  sal real,
  comm real,
  deptno integer NOT NULL,
  CONSTRAINT "PK_DETAIL" PRIMARY KEY (deptno, empno)
);
 
CREATE TABLE users
(
  id numeric NOT NULL,
  username character(20) NOT NULL,
  passwd character(20) NOT NULL,
  CONSTRAINT pk_users_id PRIMARY KEY (id),
  CONSTRAINT uq_users_name UNIQUE (username)
);
 
CREATE OR REPLACE FUNCTION sp_check_user(a_username character DEFAULT ''::bpchar, a_passwd character DEFAULT ''::bpchar)
  RETURNS boolean AS
$BODY$BEGIN
IF EXISTS (SELECT 1 FROM users WHERE username = a_username AND passwd = a_passwd) THEN
RETURN True;
ELSE
RETURN False;
END IF;
END;
$BODY$
  LANGUAGE plpgsql;
 
CREATE OR REPLACE FUNCTION sp_dept_modify(a_deptno numeric DEFAULT (-1), a_dname character DEFAULT ''::bpchar, a_loc character DEFAULT ''::bpchar, a_op_type numeric DEFAULT 0)
  RETURNS void AS
$BODY$begin
  case a_op_type
    when 0 then delete from dept where deptno = a_deptno;
    when 1 then insert into dept (deptno, dname, loc) values (a_deptno, a_dname, a_loc);
    else update dept set dname = a_dname, loc = a_loc where deptno = a_deptno;
  end case;
end;$BODY$
  LANGUAGE plpgsql;
 
CREATE OR REPLACE FUNCTION sp_emp_modify(a_empno numeric DEFAULT (-1), a_ename character DEFAULT ''::bpchar, a_job character DEFAULT ''::bpchar, a_mgr numeric DEFAULT 0, a_hiredate timestamp without time zone DEFAULT (now())::timestamp without time zone, a_sal numeric DEFAULT 0, a_comm numeric DEFAULT 0, a_deptno numeric DEFAULT (-1), a_op_type numeric DEFAULT 0)
  RETURNS void AS
$BODY$begin
  case a_op_type
    when 0 then delete from emp where empno = a_empno;
    when 1 then insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) values (a_empno, a_ename, a_job, a_mgr, a_hiredate, a_sal, a_comm, a_deptno);
    else update emp set ename = a_ename, job = a_job, mgr = a_mgr, hiredate = a_hiredate, sal = a_sal, comm = a_comm where empno = a_empno;
  end case;
end;$BODY$
  LANGUAGE plpgsql;

在ServerMethodsUnit1 里面放置对应的控件。

在datasnap 中使用unidac 访问数据(服务器端)第12张

设置数据库连接

在datasnap 中使用unidac 访问数据(服务器端)第13张

 设置对应的sql 参数

在datasnap 中使用unidac 访问数据(服务器端)第14张

在datasnap 中使用unidac 访问数据(服务器端)第15张

添加对应的 服务器端代码

 function GetDept: TDataSet;
    function GetEmp(DeptNo: integer = -1): TDataSet;
    function CheckUser(username: string = ''; passwd: string = ''):boolean;
    procedure DeptModify(DeptNo: integer = -1; DName: string = ''; Loc: string = ''; op_type: integer = 0);
    procedure EmpModify(Empno: integer = -1;
                        EName: string = '';
                        Job: string = '';
                        Mgr: integer = 0;
                        HireDate: TDateTime = 0;
                        Sal: double = 0;
                        Comm: double = 0;
                        Deptno:integer = -1;
                        op_type: integer = 0);

如图

在datasnap 中使用unidac 访问数据(服务器端)第16张

procedure TServerMethods1.DeptModify(DeptNo: integer; DName, Loc: string;
  op_type: integer);
begin
     usp_dept_modify.ParamByName('a_deptno').AsInteger := DeptNo;
  usp_dept_modify.ParamByName('a_dname').AsString := DName;
  usp_dept_modify.ParamByName('a_loc').AsString := Loc;
  usp_dept_modify.ParamByName('a_op_type').AsInteger := op_type;
  usp_dept_modify.Execute;
end;


procedure TServerMethods1.EmpModify(Empno: integer; EName, Job: string;
  Mgr: integer; HireDate: TDateTime; Sal, Comm: double; Deptno,
  op_type: integer);
begin
      usp_emp_modify.ParamByName('a_empno').AsInteger := Empno;
  usp_emp_modify.ParamByName('a_ename').AsString := EName;
  usp_emp_modify.ParamByName('a_job').AsString := Job;
  usp_emp_modify.ParamByName('a_mgr').AsInteger := Mgr;
  usp_emp_modify.ParamByName('a_hiredate').AsDateTime := HireDate;
  usp_emp_modify.ParamByName('a_sal').AsFloat := Sal;
  usp_emp_modify.ParamByName('a_Comm').AsFloat := Comm;
  usp_emp_modify.ParamByName('a_deptno').AsInteger := Deptno;
  usp_emp_modify.ParamByName('a_op_type').AsInteger := op_type;
  usp_emp_modify.Execute;
end;

function TServerMethods1.GetDept: TDataSet;
begin
    uqDept.Close;
  uqDept.Open;
  Result := uqDept;
end;

function TServerMethods1.GetEmp(DeptNo: integer): TDataSet;
begin
     uqEmp.Close;
  uqEmp.ParamByName('DEPTNO').AsInteger := DeptNo;
  uqEmp.Open;
  Result := uqEmp;
end;


function TServerMethods1.EchoString(Value: string): string;
begin
  Result := Value;
end;
function TServerMethods1.ReverseString(Value: string): string;
begin
  Result := System.StrUtils.ReverseString(Value);
end;

 服务器端就OK 了。

运行起来。

在datasnap 中使用unidac 访问数据(服务器端)第17张

 在浏览器里面我们也可以直接访问它的REST 服务

在datasnap 中使用unidac 访问数据(服务器端)第18张

在datasnap 中使用unidac 访问数据(服务器端)第19张

 剩下就是客户端的编写了,我们放到下一篇。

先来个客户端效果照。

在datasnap 中使用unidac 访问数据(服务器端)第20张

免责声明:文章转载自《在datasnap 中使用unidac 访问数据(服务器端)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇MacOS 10.15.x 最新安装 Cocoapods 教程及问题解决------实战第七课——常用控件下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

c# datagridview 相关操作。

string[] newRow ={"long","d","b"}; Gridview.Rows.Insert(Gridview.Rows.Count, newRow); datagridview 设置某行某列的单元格可修改: private voidSetGridCellEdit() { if (repgr...

审计基础-PHP命令执行

1. 命令执行 1.1 程序执行函数 程序执行函数 这些函数和 执行运算符 是紧密关联的。 因此,当运行在 安全模式 时,你必须考虑 safe_mode_exec_dir指示 exec PHP 457 exec — 执行一个外部程序 exec ( string $command ) : string 返回命令执行结果的最后一行内容,实际不echo出来的话回...

Preference 使用详解

极力推荐文章:欢迎收藏Android 干货分享 阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android 本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以下内容: Perference 简介 Perference 使用方法 使用XML定义Preference 使用Fragment 定义Preference...

JavaWeb — 添加学生信息(网页版)

eclipse+MySQL实现 一、前端部分,通过编写jsp实现添加页面: add.jsp <%@ page language="java"contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <hea...

okhttp添加自定义cookie

    1 package cn.x.request; 2 3 import java.util.ArrayList; 4 import java.util.HashMap; 5 import java.util.List; 6 7 import okhttp3.Call; 8 import okhttp3.Cooki...

C#综合揭秘——细说多线程(上)

引言   本文主要从线程的基础用法,CLR线程池当中工作者线程与I/O线程的开发,并行操作PLINQ等多个方面介绍多线程的开发。   其中委托的BeginInvoke方法以及回调函数最为常用。   而 I/O线程可能容易遭到大家的忽略,其实在开发多线程系统,更应该多留意I/O线程的操作。特别是在ASP.NET开发当中,可能更多人只会留意在客户端使用Ajax...