Delphi 根據資料庫表生成Record型別,並封裝CRUD

HelloWorldv々發表於2024-04-17

目錄
  • 前言
  • 一、Record是什麼?
  • 二、使用步驟
    • 1.根據資料庫欄位型別寫對應的Record的資料型別
    • 2.封裝CRUD及相關方法
  • 總結


前言

用Delphi+Unigui開發系統,基礎的就是增刪改查,而對於串聯的功能,需要不停的對相應的關聯表進行CRUD。對於Delphi而言,寫這個異常麻煩。最簡單的辦法,就是根據資料庫表封裝該表的CRUD方法,大大提升工作效率

一、Record是什麼?

Record 當作一個用來打包多個資料項的容器。

二、使用步驟

1.根據資料庫欄位型別寫對應的Record的資料型別

程式碼如下(示例):
在這個例子中,Teventitemmaterial就是一個 Record 型別,它包含了四個欄位來表示一個人的基本資訊。當你宣告一個 eventitemmaterial變數時,它會自動分配足夠的記憶體空間來儲存 EventItemMaterialID、EventID、MaterialID 這三個欄位的內容。

type
  Teventitemmaterial= record
    [Serialize(1)]
    EventItemMaterialID: integer;
    [Serialize(2)]
    EventID: string;
    [Serialize(3)]
    MaterialID: integer;
  end;

var
  eventitemmaterial: Teventitemmaterial;

2.封裝CRUD及相關方法

程式碼如下(示例):

type
  TeventitemmaterialCRUD = class(TObject)
  private
    FUniCon: TUniConnection;
    FeventitemmaterialQuery: TUniQuery;
    procedure PrepareMaterialQuery; // 準備查詢元件指向材料資訊表
  public
    constructor Create(AConnection: TUniConnection);
    destructor Destroy; override;

    // CRUD 方法
    function CreateEventItemMaterial(const EventItemMaterial: Teventitemmaterial): Boolean;
    function SelectEventItemMaterial(const EventItemMaterialID: Integer): Teventitemmaterial;
    function UpdateEventItemMaterial(const Oldeventitemmaterial, Neweventitemmaterial: Teventitemmaterial): Boolean;
    function DeleteEventItemMaterial(const EventItemMaterialID: Integer): Boolean;
  end;

增:

function TeventitemmaterialCRUD.CreateEventItemMaterial(const EventItemMaterial: Teventitemmaterial): Boolean;
begin
  FeventitemmaterialQuery.close;
  FeventitemmaterialQuery.SQL.Text := 'INSERT INTO EventItemMaterial (EventItemMaterialID, EventID, MaterialID) ' + 'VALUES (:EventItemMaterialID, :EventID, :MaterialID)';

  // 設定引數值
  FeventitemmaterialQuery.ParamByName('EventItemMaterialID').AsInteger := EventItemMaterial.EventItemMaterialID;
  FeventitemmaterialQuery.ParamByName('EventID').AsString := EventItemMaterial.EventID;
  FeventitemmaterialQuery.ParamByName('MaterialID').AsInteger := EventItemMaterial.MaterialID;

  FeventitemmaterialQuery.Execute;
  Result := FeventitemmaterialQuery.RowsAffected > 0;
end;

改:

function TeventitemmaterialCRUD.UpdateEventItemMaterial(const Oldeventitemmaterial, Neweventitemmaterial: Teventitemmaterial): Boolean;
begin
  FeventitemmaterialQuery.Close;
  FeventitemmaterialQuery.SQL.Text := 'UPDATE EventItemMaterial SET ' + 'EventID = :EventID, ' + 'MaterialID = :MaterialID ' + 'WHERE EventItemMaterialID = :EventItemMaterialID';

  FeventitemmaterialQuery.ParamByName('EventItemMaterialID').AsInteger := Neweventitemmaterial.EventItemMaterialID;
  FeventitemmaterialQuery.ParamByName('EventID').AsString := Neweventitemmaterial.EventID;
  FeventitemmaterialQuery.ParamByName('MaterialID').AsInteger := Neweventitemmaterial.MaterialID;

  FeventitemmaterialQuery.Execute;
  Result := FeventitemmaterialQuery.RowsAffected > 0;
end;

刪:

function TeventitemmaterialCRUD.DeleteEventItemMaterial(const EventItemMaterialID: Integer): Boolean;
begin
  FeventitemmaterialQuery.SQL.Text := 'DELETE FROM EventItemMaterial WHERE EventItemMaterialID = :EventItemMaterialID';
  FeventitemmaterialQuery.ParamByName('EventItemMaterialID').AsInteger := EventItemMaterialID;

  FeventitemmaterialQuery.Execute;
  Result := FeventitemmaterialQuery.RowsAffected > 0;
end;

查:

function TeventitemmaterialCRUD.SelectEventItemMaterial(const EventItemMaterialID: Integer): Teventitemmaterial;
var
  RecordFound: Boolean;
begin
  FeventitemmaterialQuery.close;
  FeventitemmaterialQuery.SQL.Text := 'SELECT * FROM EventItemMaterial WHERE EventItemMaterialID = :EventItemMaterialID';
  FeventitemmaterialQuery.ParamByName('EventItemMaterialID').AsInteger := EventItemMaterialID;
  FeventitemmaterialQuery.open;
  RecordFound := not FeventitemmaterialQuery.EOF;
  if RecordFound then
  begin
    Result.EventItemMaterialID := FeventitemmaterialQuery.FieldByName('EventItemMaterialID').AsInteger;
    Result.EventID := FeventitemmaterialQuery.FieldByName('EventID').AsString;
    Result.MaterialID := FeventitemmaterialQuery.FieldByName('MaterialID').AsInteger;
  end
  else
    Result := Default(Teventitemmaterial); // 返回預設值或丟擲異常,取決於你的設計
  FeventitemmaterialQuery.Close;
end;

其他:

constructor TeventitemmaterialCRUD.Create(AConnection: TUniConnection);
begin
  inherited Create;
  FUniCon := AConnection;
  PrepareMaterialQuery;
end;

destructor TeventitemmaterialCRUD.Destroy;
begin
  FeventitemmaterialQuery.Free;
  inherited;
end;

procedure TeventitemmaterialCRUD.PrepareMaterialQuery;
begin
  FeventitemmaterialQuery := TUniQuery.Create(nil);
  FeventitemmaterialQuery.Connection := FUniCon;
  FeventitemmaterialQuery.SQL.Text := 'SELECT * FROM eventitemmaterial';
  FeventitemmaterialQuery.Active := True;
end;

這時候一個輪子就造完成了。此事例呼叫時候首先呼叫Create方法連線資料庫。就可以執行增刪改查了。最後呼叫Destory方法。根據需求where條件可以適當修改。


總結

當需要用到他的時候,直接就去呼叫就可以。不需要重複的去寫sql。

相關文章