DIOCP开源项目-DEMO(怎么样操作远程数据库)

简介: 经过两天时间的开源,感谢网友提出一些修改意见,特别是在XE中,做了一部分优化。   可以在SVN中下载到最新的代码   https://code.google.com/p/diocp/ 今天做了一个操作数据库的演示   操作数据库比较简单,分两部分功能,第一部分打开SQL procedure TfrmMain.

经过两天时间的开源,感谢网友提出一些修改意见,特别是在XE中,做了一部分优化。

 

可以在SVN中下载到最新的代码

 

https://code.google.com/p/diocp/

今天做了一个操作数据库的演示<这里我拿出我在实际项目中操作数据库的方法,集成在Demo中>

 

操作数据库比较简单,分两部分功能,第一部分打开SQL

procedure TfrmMain.btnOpenSQLClick(Sender: TObject);
var
  lvJSonStream, lvRecvObject:TJsonStream;
  lvStream:TStream;
  lvData:AnsiString;
  l, j, x:Integer;
begin
  lvJSonStream := TJsonStream.Create;
  try
    lvJSonStream.JSon := SO();
    lvJSonStream.JSon.I['cmdIndex'] := 1001;   //打开一个SQL脚本,获取数据
    lvJSonStream.Json.S['sql'] := mmoSQL.Lines.Text;

    FClientSocket.sendObject(lvJSonStream);
  finally
    lvJSonStream.Free;
  end;

  //读取数据
  lvRecvObject := TJsonStream.Create;
  try
    FClientSocket.recvObject(lvRecvObject);

    if not lvRecvObject.getResult then
    begin
      raise Exception.Create(lvRecvObject.getResultMsg);
    end;

    SetLength(lvData, lvRecvObject.Stream.Size);
    lvRecvObject.Stream.Position := 0;
    lvRecvObject.Stream.ReadBuffer(lvData[1], lvRecvObject.Stream.Size);

    cdsMain.XMLData := lvData;
  finally
     lvRecvObject.Free;
  end;
end;

服务端ClientContext中的处理

procedure TClientContext.dataReceived(const pvDataObject:TObject);
var
  lvJsonStream:TJSonStream;
  lvFile:String;
  lvCmdIndex:Cardinal;
  lvXMLData, lvEncodeData:AnsiString;
  lvSQL:String;
begin
  lvJsonStream := TJSonStream(pvDataObject);

  lvCmdIndex := lvJsonStream.JSon.I['cmdIndex'];

  //echo测试
  if lvCmdIndex= 1000 then
  begin
    InterlockedIncrement(TesterINfo.__RecvTimes);
    //回写数据
    writeObject(lvJsonStream);
  end else if lvCmdIndex = 1001 then
  begin  //根据sql获取一个数据,放在Stream中
    try
      lvSQL := lvJsonStream.Json.S['sql'];

      lvXMLData := dmMain.CDSProvider.QueryXMLData(lvSQL);

      lvJsonStream.Clear();
      lvJsonStream.Stream.WriteBuffer(lvXMLData[1], Length(lvXMLData));
      lvJsonStream.setResult(True);
    except
      on e:Exception do
      begin
        lvJsonStream.Clear();
        lvJsonStream.setResult(False);
        lvJsonStream.setResultMsg(e.Message);
      end;
    end;
    
    //回写数据
    writeObject(lvJsonStream);

 

保存数据用到一个非常好用的DLL

客户端:

procedure TfrmMain.btnPostClick(Sender: TObject);
var
  lvJSonStream, lvRecvObject:TJsonStream;
  lvStream:TStream;
  lvData:AnsiString;
  l, j, x:Integer;
begin
  if cdsMain.State in [dsInsert, dsEdit] then cdsMain.Post;
  
  if cdsMain.ChangeCount = 0 then
  begin
    ShowMessage('没有做任何修改!');
    exit;
  end;
  lvJSonStream := TJsonStream.Create;
  try
    lvJSonStream.JSon := SO();
    lvJSonStream.JSon.I['cmdIndex'] := 1002;   //打开一个SQL脚本,获取数据

    //打包修改记录
    with TCDSOperatorWrapper.createCDSEncode do
    begin
      setTableINfo(PAnsiChar(AnsiString(edtUpdateTable.Text)), PAnsiChar(AnsiString(edtKeyFields.Text)));
      setData(cdsMain.Data, cdsMain.Delta);
      //执行编码
      Execute;
      lvData := getPackageData;
    end;

    mmoData.Clear;
    mmoData.Lines.Add(lvData);

    lvJSonStream.Stream.Write(lvData[1], Length(lvData));

    FClientSocket.sendObject(lvJSonStream);
  finally
    lvJSonStream.Free;
  end;

  //读取数据
  lvRecvObject := TJsonStream.Create;
  try
    FClientSocket.recvObject(lvRecvObject);

    if not lvRecvObject.getResult then
    begin
      raise Exception.Create(lvRecvObject.getResultMsg);
    end else
    begin
      ShowMessage('保存成功!');
    end;
  finally
     lvRecvObject.Free;
  end;

  cdsMain.MergeChangeLog();

end;

服务端:

if lvCmdIndex = 1002 then  //保存数据到熟客
  begin
    try
      lvJsonStream.Stream.Position := 0;
      SetLength(lvEncodeData, lvJSonStream.Stream.Size);
      lvJsonStream.Stream.ReadBuffer(lvEnCodeData[1], lvJSonStream.Stream.Size);

      dmMain.ExecuteApplyUpdate(lvEncodeData);

      lvJsonStream.Clear();
      lvJsonStream.setResult(True);
    except
      on e:Exception do
      begin
        lvJsonStream.Clear();
        lvJsonStream.setResult(False);
        lvJsonStream.setResultMsg(e.Message);
      end;
    end;
    
    //回写数据
    writeObject(lvJsonStream);
  end

 

 

目录
相关文章
|
1月前
|
存储 关系型数据库 MySQL
一个项目用5款数据库?MySQL、PostgreSQL、ClickHouse、MongoDB区别,适用场景
一个项目用5款数据库?MySQL、PostgreSQL、ClickHouse、MongoDB——特点、性能、扩展性、安全性、适用场景比较
|
3月前
|
NoSQL 关系型数据库 MySQL
开源数据库
【8月更文挑战第26天】开源数据库
67 11
|
20天前
|
存储 SQL Apache
Apache Doris 开源最顶级基于MPP架构的高性能实时分析数据库
Apache Doris 是一个基于 MPP 架构的高性能实时分析数据库,以其极高的速度和易用性著称。它支持高并发点查询和复杂分析场景,适用于报表分析、即席查询、数据仓库和数据湖查询加速等。最新发布的 2.0.2 版本在性能、稳定性和多租户支持方面有显著提升。社区活跃,已广泛应用于电商、广告、用户行为分析等领域。
Apache Doris 开源最顶级基于MPP架构的高性能实时分析数据库
|
27天前
|
存储 关系型数据库 MySQL
MySQL vs. PostgreSQL:选择适合你的开源数据库
在众多开源数据库中,MySQL和PostgreSQL无疑是最受欢迎的两个。它们都有着强大的功能、广泛的社区支持和丰富的生态系统。然而,它们在设计理念、性能特点、功能特性等方面存在着显著的差异。本文将从这三个方面对MySQL和PostgreSQL进行比较,以帮助您选择更适合您需求的开源数据库。
102 4
|
1月前
|
SQL JavaScript 关系型数据库
node博客小项目:接口开发、连接mysql数据库
【10月更文挑战第14天】node博客小项目:接口开发、连接mysql数据库
|
1月前
|
存储 JSON Ubuntu
时序数据库 TDengine 支持集成开源的物联网平台 ThingsBoard
本文介绍了如何结合 Thingsboard 和 TDengine 实现设备管理和数据存储。Thingsboard 中的“设备配置”与 TDengine 中的超级表相对应,每个设备对应一个子表。通过创建设备配置和设备,实现数据的自动存储和管理。具体操作包括创建设备配置、添加设备、写入数据,并展示了车辆实时定位追踪和车队维护预警两个应用场景。
60 3
|
1月前
|
SQL 关系型数据库 MySQL
Go语言项目高效对接SQL数据库:实践技巧与方法
在Go语言项目中,与SQL数据库进行对接是一项基础且重要的任务
67 11
|
2月前
|
JavaScript Java 关系型数据库
毕设项目&课程设计&毕设项目:基于springboot+vue实现的在线考试系统(含教程&源码&数据库数据)
本文介绍了一个基于Spring Boot和Vue.js实现的在线考试系统。随着在线教育的发展,在线考试系统的重要性日益凸显。该系统不仅能提高教学效率,减轻教师负担,还为学生提供了灵活便捷的考试方式。技术栈包括Spring Boot、Vue.js、Element-UI等,支持多种角色登录,具备考试管理、题库管理、成绩查询等功能。系统采用前后端分离架构,具备高性能和扩展性,未来可进一步优化并引入AI技术提升智能化水平。
毕设项目&课程设计&毕设项目:基于springboot+vue实现的在线考试系统(含教程&源码&数据库数据)
|
2月前
|
Java 关系型数据库 MySQL
毕设项目&课程设计&毕设项目:springboot+jsp实现的房屋租租赁系统(含教程&源码&数据库数据)
本文介绍了一款基于Spring Boot和JSP技术的房屋租赁系统,旨在通过自动化和信息化手段提升房屋管理效率,优化租户体验。系统采用JDK 1.8、Maven 3.6、MySQL 8.0、JSP、Layui和Spring Boot 2.0等技术栈,实现了高效的房源管理和便捷的租户服务。通过该系统,房东可以轻松管理房源,租户可以快速找到合适的住所,双方都能享受数字化带来的便利。未来,系统将持续优化升级,提供更多完善的服务。
毕设项目&课程设计&毕设项目:springboot+jsp实现的房屋租租赁系统(含教程&源码&数据库数据)
|
1月前
|
SQL JSON 关系型数据库
MySQL是一个广泛使用的开源关系型数据库管理系统,它有许多不同的版本
【10月更文挑战第3天】MySQL是一个广泛使用的开源关系型数据库管理系统,它有许多不同的版本
147 5
下一篇
无影云桌面