经过两天时间的开源,感谢网友提出一些修改意见,特别是在XE中,做了一部分优化。
可以在SVN中下载到最新的代码
https://code.google.com/p/diocp/
今天做了一个操作数据库的演示<这里我拿出我在实际项目中操作数据库的方法&#xff0c;集成在Demo中>
操作数据库比较简单,分两部分功能&#xff0c;第一部分打开SQL
procedure TfrmMain.btnOpenSQLClick(Sender: TObject);
varlvJSonStream, lvRecvObject:TJsonStream;lvStream:TStream;lvData:AnsiString;l, j, x:Integer;
beginlvJSonStream :&#61; TJsonStream.Create;trylvJSonStream.JSon :&#61; SO();lvJSonStream.JSon.I[&#39;cmdIndex&#39;] :&#61; 1001; //打开一个SQL脚本&#xff0c;获取数据lvJSonStream.Json.S[&#39;sql&#39;] :&#61; mmoSQL.Lines.Text;FClientSocket.sendObject(lvJSonStream);finallylvJSonStream.Free;end;//读取数据lvRecvObject :&#61; TJsonStream.Create;tryFClientSocket.recvObject(lvRecvObject);if not lvRecvObject.getResult thenbeginraise Exception.Create(lvRecvObject.getResultMsg);end;SetLength(lvData, lvRecvObject.Stream.Size);lvRecvObject.Stream.Position :&#61; 0;lvRecvObject.Stream.ReadBuffer(lvData[1], lvRecvObject.Stream.Size);cdsMain.XMLData :&#61; lvData;finallylvRecvObject.Free;end;
end;
服务端ClientContext中的处理
procedure TClientContext.dataReceived(const pvDataObject:TObject);
varlvJsonStream:TJSonStream;lvFile:String;lvCmdIndex:Cardinal;lvXMLData, lvEncodeData:AnsiString;lvSQL:String;
beginlvJsonStream :&#61; TJSonStream(pvDataObject);lvCmdIndex :&#61; lvJsonStream.JSon.I[&#39;cmdIndex&#39;];//echo测试if lvCmdIndex&#61; 1000 thenbeginInterlockedIncrement(TesterINfo.__RecvTimes);//回写数据writeObject(lvJsonStream);end else if lvCmdIndex &#61; 1001 thenbegin //根据sql获取一个数据&#xff0c;放在Stream中trylvSQL :&#61; lvJsonStream.Json.S[&#39;sql&#39;];lvXMLData :&#61; dmMain.CDSProvider.QueryXMLData(lvSQL);lvJsonStream.Clear();lvJsonStream.Stream.WriteBuffer(lvXMLData[1], Length(lvXMLData));lvJsonStream.setResult(True);excepton e:Exception dobeginlvJsonStream.Clear();lvJsonStream.setResult(False);lvJsonStream.setResultMsg(e.Message);end;end;//回写数据writeObject(lvJsonStream);
保存数据用到一个非常好用的DLL
客户端:
procedure TfrmMain.btnPostClick(Sender: TObject);
varlvJSonStream, lvRecvObject:TJsonStream;lvStream:TStream;lvData:AnsiString;l, j, x:Integer;
beginif cdsMain.State in [dsInsert, dsEdit] then cdsMain.Post;if cdsMain.ChangeCount &#61; 0 thenbeginShowMessage(&#39;没有做任何修改!&#39;);exit;end;lvJSonStream :&#61; TJsonStream.Create;trylvJSonStream.JSon :&#61; SO();lvJSonStream.JSon.I[&#39;cmdIndex&#39;] :&#61; 1002; //打开一个SQL脚本&#xff0c;获取数据//打包修改记录with TCDSOperatorWrapper.createCDSEncode dobeginsetTableINfo(PAnsiChar(AnsiString(edtUpdateTable.Text)), PAnsiChar(AnsiString(edtKeyFields.Text)));setData(cdsMain.Data, cdsMain.Delta);//执行编码Execute;lvData :&#61; getPackageData;end;mmoData.Clear;mmoData.Lines.Add(lvData);lvJSonStream.Stream.Write(lvData[1], Length(lvData));FClientSocket.sendObject(lvJSonStream);finallylvJSonStream.Free;end;//读取数据lvRecvObject :&#61; TJsonStream.Create;tryFClientSocket.recvObject(lvRecvObject);if not lvRecvObject.getResult thenbeginraise Exception.Create(lvRecvObject.getResultMsg);end elsebeginShowMessage(&#39;保存成功!&#39;);end;finallylvRecvObject.Free;end;cdsMain.MergeChangeLog();end;
服务端:
if lvCmdIndex &#61; 1002 then //保存数据到熟客begintrylvJsonStream.Stream.Position :&#61; 0;SetLength(lvEncodeData, lvJSonStream.Stream.Size);lvJsonStream.Stream.ReadBuffer(lvEnCodeData[1], lvJSonStream.Stream.Size);dmMain.ExecuteApplyUpdate(lvEncodeData);lvJsonStream.Clear();lvJsonStream.setResult(True);excepton e:Exception dobeginlvJsonStream.Clear();lvJsonStream.setResult(False);lvJsonStream.setResultMsg(e.Message);end;end;//回写数据writeObject(lvJsonStream);end