After two days of open-source development, I would like to thank the netizens for providing some suggestions for the changes, especially in Xe.
You can download the latest code from SVN.
https://code.google.com/p/diocp/
Today, I made a database operation demonstration.
Database Operations are relatively simple. There are two functions. The first part is to enable the 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; // open an SQL script to obtain lvjsonstream data. JSON. s ['SQL']: = mmosql. lines. text; fclientsocket. sendobject (lvjsonstream); finally lvjsonstream. free; end; // read data 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;
Processing in clientcontext on the server
Procedure tclientcontext. values (const pvdataobject: tobject); var lvjsonstream: tjsonstream; lvfile: string; lvcmdindex: Cardinal; values, lvencodedata: ansistring; lvsql: string; begin lvjsonstream: = tjsonstream (pvdataobject ); lvcmdindex: = lvjsonstream. JSON. I ['cmdindex ']; // echo test if lvcmdindex = 1000 then begin interlockedincrement (testerinfo. _ recvtimes); // write-back data writeobject (lvjsonstream); end else if lvcmdindex = 1001 then begin // obtain data based on SQL and put it in stream try lvsql: = lvjsonstream. JSON. s ['SQL']; lvxmldata: = dmmain. cdsprovider. queryxmldata (lvsql); lvjsonstream. clear (); lvjsonstream. stream. writebuffer (lvxmldata [1], length (lvxmldata); lvjsonstream. setresult (true); counter t on E: exception do begin lvjsonstream. clear (); lvjsonstream. setresult (false); lvjsonstream. setresultmsg (E. message); end; // writeobject (lvjsonstream );
A very useful DLL is used to save data.
Client:
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 ('no modification made! '); Exit; end; lvjsonstream: = tjsonstream. create; try lvjsonstream. JSON: = So (); lvjsonstream. JSON. I ['cmdindex ']: = 1002; // open an SQL script and obtain the data. // package the modification record with tcdsoperatorwrapper. createcdsencode do begin settableinfo (pansichar (ansistring (edtupdatetable. text), pansichar (ansistring (edtkeyfields. text); setdata (cdsmain. data, cdsmain. delta); // execute code execute; lvdata: = getpackagedata; end; mmodata. clear; mm Odata. lines. add (lvdata); lvjsonstream. stream. write (lvdata [1], length (lvdata); fclientsocket. sendobject (lvjsonstream); finally lvjsonstream. free; end; // read data lvrecvobject: = tjsonstream. create; try fclientsocket. recvobject (lvrecvobject); if not lvrecvobject. getresult then begin raise exception. create (lvrecvobject. getresultmsg); End else begin showmessage ('saved successfully! '); End; finally lvrecvobject. Free; end; cdsmain. mergechangelog (); end;
Server:
If lvcmdindex = 1002 then // Save the data to a regular customer 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); counter t on E: exception do begin lvjsonstream. clear (); lvjsonstream. setresult (false); lvjsonstream. setresultmsg (E. message); end; // writeobject (lvjsonstream); End