Delphi 根据数据库表生成Record类型,并封装CRUD

前言

用Delphi+Unigui开发系统,基础的就是增删改查,而对于串联的功能,需要不停的对相应的关联表进行CRUD。对于Delphi而言,写这个异常麻烦。最简单的办法,就是根据数据库表封装该表的CRUD方法,大大提升工作效率

一、Record是什么?

Record 当作一个用来打包多个数据项的容器。

二、使用步骤

1.根据数据库字段类型写对应的Record的数据类型

代码如下(示例): 在这个例子中,Teventitemmaterial就是一个 Record 类型,它包含了四个字段来表示一个人的基本信息。当你声明一个 eventitemmaterial变量时,它会自动分配足够的内存空间来存储 EventItemMaterialID、EventID、MaterialID 这三个字段的内容。

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

var
  eventitemmaterial: Teventitemmaterial;

2.封装CRUD及相关方法

代码如下(示例):

c 复制代码
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;

增:

c 复制代码
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;

改:

c 复制代码
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;

删:

c 复制代码
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;

查:

c 复制代码
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;

其他:

c 复制代码
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。

相关推荐
小满zs15 分钟前
Go语言第七章(Map)
后端·go
Undoom32 分钟前
我用豆包Seed-Evolving搞了个高中物理可视化工具,结果被自己的高中物理水平整破防了
后端
木叶丸33 分钟前
从 Loop 到 Graph:AI 智能体协作系统工程指南
前端·后端·架构
程序猿DD2 小时前
OctaFuse Gateway 2.3.0:供应商粘性绑定,让缓存命中更稳定
后端
乐橙开放平台2 小时前
老旧小区监控事件驱动派单:基于 setMessageCallback 的 msgType 分级与工单闭环实现
后端·物联网·音视频
猿长大人3 小时前
C# | MediatR 入门指南:后端架构解耦
分布式·后端·架构·c#·.net
人间凡尔赛3 小时前
Kubernetes十周年:从Cloud Native到AI Native的架构范式跃迁
后端·云原生·架构
John jj3 小时前
拆解 Telegram 群组频道收录市场:三类方案,一个可运行的评分模型,目前TG中文人工评分加模型评分机制——LetsTG收录“快速”、“无门槛”
大数据·后端·python·深度学习·搜索引擎·django·全文检索
Boop_wu4 小时前
SpringBoot 集成阿里云短信认证服务(个人)
spring boot·后端·阿里云
Gopher_HBo4 小时前
Engine 核心(gin.go)
后端