博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DIOCP开源项目-DEMO(怎么样操作远程数据库)
阅读量:7279 次
发布时间:2019-06-30

本文共 3791 字,大约阅读时间需要 12 分钟。

经过两天时间的开源,感谢网友提出一些修改意见,特别是在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

 

 

转载地址:http://exzjm.baihongyu.com/

你可能感兴趣的文章
Android四种常用的消息传递机制/模式的比较
查看>>
我的友情链接
查看>>
五虎遁月 和 五鼠遁时 法
查看>>
很好的一个blog,记录一下
查看>>
关于mysql修复表
查看>>
DBWn与物理写
查看>>
ajax实现的动态展开
查看>>
python 与数据结构
查看>>
LAMP搭建2:Apache安装
查看>>
linux之正则表达式和grep
查看>>
示例演示“距离矢量路由算法”工作原理
查看>>
mysql replication支持ssl,一主一从 +CA服务器
查看>>
mybatis源码总结
查看>>
机器学习理论篇1:机器学习的数学基础
查看>>
zookeeper简介及安装
查看>>
jenkins+mvn+publish over ssh实现自动化部署
查看>>
Oracle普通表转分区表的几种方法
查看>>
redis双写
查看>>
objective-c 指针
查看>>
设计模式之结构型模式—— 2.3 装饰模式
查看>>