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。

相关推荐
十年Java程序媛2 小时前
Java枚举Enum完整教程|替代静态常量,开发与面试要点
java·开发语言·spring boot·后端·面试
我是人✓2 小时前
SpringBoot静态资源映射揭秘
java·spring boot·后端
全栈弄潮儿2 小时前
Python实战第7期:字典与集合
后端·python·编程语言
码事漫谈2 小时前
DeepSeek 又更新!但怎么有个分数往下掉?
后端
吃饱了得干活2 小时前
用 PageHelper 同步数据到 ES:能跑,但这几个坑得先知道
后端·elasticsearch
金銀銅鐵2 小时前
[Java] 借助GUI展示class文件的内容(v1.0版本)
jvm·后端·ai编程
皮皮林5513 小时前
Java 导出 Excel 利器:JXLS
后端
吃饱了得干活3 小时前
从 LIKE 查询到毫秒级搜索:Elasticsearch 核心原理与 Java 实战
后端·elasticsearch
tianbin9115 小时前
大模型训练与推理:API中转站在企业AI落地中的隐藏价值
大数据·后端·ai