DIOCP開源項目-DEMO(怎么樣操作遠程數據庫)


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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM