經過兩天時間的開源,感謝網友提出一些修改意見,特別是在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