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。

相关推荐
RISCV_Explorer1 小时前
RISC-V启动与运行时规范机制解析——BRS约定、HSM多核启动与设备树要求
后端·risc-v
星栈独行1 小时前
ADK-Rust 是什么?Rust 生态新一代 AI Agent 开发套件
人工智能·后端·rust
JavaGuide2 小时前
对标 MinIO!全新一代分布式文件系统正式发布
前端·后端
用户8356290780512 小时前
使用 Python 将 DOCX 转换为 Markdown
后端·python
IT_陈寒2 小时前
Vue computed属性这个坑,我居然踩了三次才爬出来
前端·人工智能·后端
孙启超3 小时前
【AI开发之Rust】第 7 课:错误处理 —— panic、Result 与 `?`
人工智能·分布式·后端·爬虫·spring cloud·架构·rust
烈风逍遥4 小时前
第一篇:SeaPack 全栈项目工程化实践
前端·后端·架构
烈风逍遥4 小时前
第二篇:SeaPack 权限体系:从"谁都能看"到"该看什么看什么"
前端·后端·架构
JoyT4 小时前
Spring AI 2.0 Agent 进阶:Memory、State 与 Context Engineering 常见技术全景
后端
拖孩4 小时前
这个小程序是 AI 帮我写的,可它里面一个 AI 功能都没有
前端·后端·微信小程序