• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • Synopse mORMot框架樣例學習03 - NamedPipe Client-Server

    標簽: delphi  pascal  mORMot

    前邊的例01和例02分別展示了靜態服務器及嵌入式SQLite3服務器的實現方法,例03是命名管道客戶端-服務器,例01中用JSON文件存儲數據(按我的理解,每一個SQLRecord就是一個表格,在存儲的時候多個表格應該需要多個JSON文件取存儲),例02中使用SQLite3數據庫存儲,只需要一個.db3數據庫文件就能存放所有的SQLRecord(表格),例03中實現了客戶端-服務器的通訊,客戶端的數據需要傳遞到服務器去處理.

    先看看服務器是怎么運行的,例03主單元Unit2.pas實現了命名管道服務器,在代碼中看比較方便,省略了部分代碼,只看主要的部分:

    unit Unit2;
    interface
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs,
      // 下方是mORMot單元
      SynCommons, mORMot, mORMotSQLite3, SynSQLite3Static, StdCtrls, SampleData;
    type
      TForm1 = class(TForm)
       { ...(省略) }
      public
        Model: TSQLModel; { 聲明SQL操作模型 }
        Server: TSQLRestServerDB; { 服務器的聲明 }
      end;
    { ...(省略) }
    implementation
    {$R *.dfm}
    { ...(省略) }
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      Model := CreateSampleModel; { 窗口創建的時候初始化數據庫操作模型 }
      Server := TSQLRestServerDB.Create(Model, ChangeFileExt(ExeVersion.ProgramFileName, '.db3')); { 初始化一個Rest服務器,這里和樣例2是一樣的 }
      Server.CreateMissingTables; { 根據模型Model創建必須的表格(也就是SampleData單元定義的類) }
      Server.ExportServerNamedPipe('03'); { 創建命名管道,名字為03,客戶端初始化的時候必須和此名稱一致才能進行進程間通訊 }
    end;
    { ...(省略) }
    end.
    

    然后是客戶端部分,這一次我想把SampleData單元進行簡單的改造下,添加一個用戶信息類,用于存儲用戶名和密碼,這樣我們在初始化數據庫的時候會有2個表格SampleRecord和UserInfo,還是看代碼的注釋進行說明:

    unit SampleData;
    interface
    uses
      SynCommons, mORMot;
    type
      TSQLSampleRecord = class(TSQLRecord)
      { ...省略 }
      end;
    
      { 我們再添加一個類,用于記錄用戶名和密碼 }
      TSQLUserInfo = class(TSQLRecord)
      private
        fUserName: RawUTF8;
        fPassWord: RawUTF8;
        fRemark: TSQLSampleRecord;
      published
        property UserName: RawUTF8 read fUserName write fUserName;
        property PassWord: RawUTF8 read fPassWord write fPassWord;
        property Remark: TSQLSampleRecord read fRemark write fRemark;
      end;
    
    function CreateSampleModel: TSQLModel;
    
    implementation
    
    function CreateSampleModel: TSQLModel;
    begin
      result := TSQLModel.Create([TSQLSampleRecord, TSQLUserInfo{ 創建模型的時候要加上我們新定義的類 }]);
    end;
    
    end.

    客戶端同樣需要進行一些改造,我們需要輸入用戶名和密碼信息,然后一同添加到數據庫中,改造后是這個樣子的:

    在這里,客戶端的工程單元必須創建客戶端命名管道,并且管道的名字要與服務端保持一致:

    { 創建與服務端一致的客戶端命名管道,以便與服務端通信 }  
    Form1.Database := TSQLRestClientURINamedPipe.Create(Form1.Model, '03');

    主單元Unit1.pas實現代碼如下:

    unit Unit1;
    interface
    uses
      {$ifdef MSWINDOWS}
      Windows, Messages, Graphics,
      {$endif}
      Classes, SysUtils, Forms, Controls, Dialogs, StdCtrls, SynCommons, SynTable,
      mORMot, SampleData;
    type
    { ...省略 }
    
    implementation
    
    {$ifdef FPC}
    {$R *.lfm}
    {$else}
    {$R *.dfm}
    {$endif}
    
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      Model := CreateSampleModel;  { 調用后SampleRecord和UserInfo同時對數據庫中對應的2個表進行映射 }
    end;
    
    procedure TForm1.AddButtonClick(Sender: TObject);
    var
      Rec: TSQLSampleRecord;
      UserRec: TSQLUserInfo; { 聲明用戶信息類 }
    begin
      Rec := TSQLSampleRecord.Create;
      UserRec := TSQLUserInfo.Create; { 創建實例 }
      try
        Rec.Name := StringToUTF8(NameEdit.Text);
        Rec.Question := StringToUTF8(QuestionMemo.Text);
        Rec.Log := StringToUTF8('added ' + NameEdit.Text + ' ' + QuestionMemo.Text);
        if Database.Add(Rec, true) = 0 then
          ShowMessage('Error adding the data')
        else
        begin
          MemoLog.Lines.Add('Name: ' + NameEdit.Text + ';' + 'Question: ' + QuestionMemo.Text + ';');
          NameEdit.Text := '';
          QuestionMemo.Text := '';
          NameEdit.SetFocus;
        end;
        { 把用戶名和密碼寫進數據庫 }
        UserRec.UserName := StringToUTF8(UserNameEdit.Text);
        UserRec.PassWord := StringToUTF8(PassWordEdit.Text);
        if DataBase.Add(UserRec, true) = 0 then
          ShowMessage('Error adding the data')
        else
        begin
          UserNameEdit.Clear;
          PassWordEdit.Clear;
        end;
      finally
        Rec.Free;
        UserRec.Free;
      end;
    end;
    { ...省略 }
    end.
    

    需要先啟動服務端,然后再啟動客戶端,同樣寫入3組記錄,然后用sqliteadmin看看數據庫的情況:

    數據庫存儲情況如下:

    可以看到,和預想的情況一樣,例02和例03不管是在嵌入式數據庫還是客戶端-服務器的設計,除了DataBase初始化的部分有少許不同,其他代碼可以原封不動,感覺很是方便.到這里基本上摸清了例01-例03樣例的目的,就是最基礎的ORM操作,和不同數據存儲的方式使用,對照文檔看一下,確實如文檔所說,作者并沒有夸大框架的功能,但是總感覺不太習慣作者的英語表達方式,不動手實踐,有的東西光看文檔的確能讓人感到迷糊,繼續努力學習.

    版權聲明:本文為loloopop原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/loloopop/article/details/102628175

    智能推薦

    前端學習——HTML的各種標簽(以及代碼樣例)

    html標題head標簽:快捷鍵h+8(快捷鍵中的數字鍵是大鍵盤上的數字鍵,不是小鍵盤的) 1:打開網頁出現亂碼時,在head標簽中加<meta charset="utf-8" />  快捷鍵m+6 htnl的body標簽 1:h1到h6,會將其中的數據加粗加黑顯示,并且顯示以此減弱,標題標簽自帶換行功能 2:標簽居中 <h1 align="...

    機器學習(python+numpy+tensorflow)實戰樣例

    步驟: 1. 生成人工數據集及可視化(matplotlib) 2. 構建線性模型 3. 定義損失函數 4. 定義優化器,最小化損失函數 5. 訓練結果的可視化 6. 利用學習到的模型進行預測...

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!

    Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...

    猜你喜歡

    requests實現全自動PPT模板

    http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

    Linux C系統編程-線程互斥鎖(四)

    互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...

    統計學習方法 - 樸素貝葉斯

    引入問題:一機器在良好狀態生產合格產品幾率是 90%,在故障狀態生產合格產品幾率是 30%,機器良好的概率是 75%。若一日第一件產品是合格品,那么此日機器良好的概率是多少。 貝葉斯模型 生成模型與判別模型 判別模型,即要判斷這個東西到底是哪一類,也就是要求y,那就用給定的x去預測。 生成模型,是要生成一個模型,那就是誰根據什么生成了模型,誰就是類別y,根據的內容就是x 以上述例子,判斷一個生產出...

    styled-components —— React 中的 CSS 最佳實踐

    https://zhuanlan.zhihu.com/p/29344146 Styled-components 是目前 React 樣式方案中最受關注的一種,它既具備了 css-in-js 的模塊化與參數化優點,又完全使用CSS的書寫習慣,不會引起額外的學習成本。本文是 styled-components 作者之一 Max Stoiber 所寫,首先總結了前端組件化樣式中的最佳實踐原則,然后在此基...

    精品国产乱码久久久久久蜜桃不卡