Delphi 根据数据库表生成Record类型,并封装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。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?