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。

相关推荐
0110_102421 分钟前
tauri + rust的环境搭建---初始化以及构建
开发语言·后端·rust
文心快码BaiduComate25 分钟前
限时集福!Comate挂件/皮肤上线,符(福)气掉落中~
前端·后端·程序员
道之极万物灭1 小时前
Go小工具合集
开发语言·后端·golang
瑞士卷@1 小时前
MyBatis入门到精通(Mybatis学习笔记)
java·数据库·后端·mybatis
yuuki2332331 小时前
【C语言】文件操作(附源码与图片)
c语言·后端
IT_陈寒1 小时前
Python+AI实战:用LangChain构建智能问答系统的5个核心技巧
前端·人工智能·后端
无名之辈J2 小时前
系统崩溃(OOM)
后端
码农刚子2 小时前
ASP.NET Core Blazor简介和快速入门 二(组件基础)
javascript·后端
间彧2 小时前
Java ConcurrentHashMap如何合理指定初始容量
后端
catchadmin2 小时前
PHP8.5 的新 URI 扩展
开发语言·后端·php