mORMot 增、查、改、删 —— CRUD (二)
mORMot 增、查、改、删 —— CRUD (二)
最近有看了会mORMot ,总感觉这是个好框架,其实好多Delphi开源框架也是建立在他上面,QuickORM、DelphiWebMVC。
这次想对mORMot 数据库相关使用再次做个笔记。
记得以前有个ECO我当时也花了好久学习,希望能够能简化开发周期,降低业务模型建立,但后开发团队转到c#下了。
言归正传mORMot 和ECO在对库ORM时都会自动建立一个字段 ID 用以构建,表的关系和引导对应记录。
按这个思路,我们可以继续……
在mORMot 中如果要让一个对象服务于一个数据模型,那么就必须让这个模型增加对象。
比如:前文提到的
Account := TAccount.Create;
Account.Name := TGuidxxxxx;
Account.Account := 123;
Account.Sno := 'abcd';
if db.Add(Account, True) = 0 then
begin
ShowMessage('失败');
end;
其实 对于DB这个数据模型,在执行 Add之后,会返回ID号,这个数字是一个大于0 的数字。
acc := TAccount.Create(db, 'Name=?', [edt1.Text]);
//下面这句是错误的,一定会有实例,只是这个实例是否有效
if acc<>nil then
begin
//Do Samething
end;
//在一个数据模型中找并创建,一定会有实例,只是这个实例是否有效,通过ID来判断。
if acc.ID>0 then
begin
//Do Samething
edt3.Text := acc.Name;
end;
同理,Update和Delete也是这么回事。
但作为体系型框架mORMot 对于数据库的操作要复杂得多,这句话可以这么来讲,站在构建的角度他是ORM,在客户端实现跨平台、跨应用、跨系统访问同一数据库。
从实现的方式可以从服务器端直接操作、从客户端操作。从语言角度内置VCL数据展示和JSON自定义。
为了能实现快平台,快语言,它以RESTFUL作为基础通讯,当然也支持其它方式。
VCL Grid显示数据,mORMot 已经实现主要的功能,可以通过
function TRestClient_YJ.GetCMDHis(const StartDT, EndDT: Tdatetime): TSQLTableJSON;
var
vStartDT, vEndDT: TTimeLog;
begin
// 使用完毕需要释放,要在调用函数中释放 『但其实不可以释放』
vStartDT := TimeLogFromDateTime(StartDT);
vEndDT := TimeLogFromDateTime(EndDT);
Result := _RestClient.ORM.MultiFieldValues(TCMDHis, 'ID,CreationDate,CommandID, EmployeeNo, EquipmentCode, CMDSerial',
'CreationDate >= ? AND CreationDate <= ?', [vStartDT, vEndDT]);
//建立指定字段的数据表 (TSQLTableJSON)
end;
……
var
fGrid : TSQLTableToGrid;
fTable: TSQLTableJSON;
DGrid:TDrawGrid ; // 继承自TDrawGrid 下的都可以
……
try
fTable := _Client.GetCMDHis(dtpStart.DateTime, dtpEnd.DateTime);
fGrid := TSQLTableToGrid.Create(DGrid, fTable, nil); //关键语句
fGrid.SetAlignedByType(sftCurrency, alRight);
fGrid.OnValueText := OnText;
// fGrid.SetFieldFixedWidth(100);
fGrid.FieldTitleTruncatedNotShownAsHint := true;
DGrid.Options := DGrid.Options + [goRowSelect];
RowsCount := fTable.RowCount;
Timer.Stop;
finally
Screen.Cursor := crDefault;
end;
获取指定行的数据
procedure TOfflineDataFrame.N1Click(Sender: TObject);
var
R, C : Integer;
sData: RawByteString;
begin
inherited;
//这里示例表格内查找
R := DGrid.Row;
C := DGrid.Col;
if (R <= 0) or (fGrid.Table = nil) then
exit;
//这里需要注意U2S函数,mORMot内部所有字符串数据均已转为为UTF8 所以要恢复到 UTF16,要还原。
sData := U2S(fGrid.Table.FieldValue('CMDSerial', R));
if MesCommunication.TCP_SendYJ2(sData) then
begin
LogDebug('离线发送:' + sData)
end;
end;
删除指定行数据
procedure TOfflineDataFrame.N2Click(Sender: TObject);
var
R, C : Integer;
sData: RawByteString;
sID : string;
ID : Integer;
begin
inherited;
R := DGrid.Row;
C := DGrid.Col;
if (R <= 0) or (fGrid.Table = nil) then
exit;
//同前一段,查找,另外对于删除也做了一下调整,
//-----这里改为调用服务器函数的方式,而没有用客户端链接数据模型,
/。/另外已经方位到了ID所以直接用
sID := U2S(fGrid.Table.FieldValue('ID', R));
//服务器端删除成功然后调用一次显示。
if _Client.DelCMDHis(StrToInt(sID)) then
btnQueryClick(nil);
end;
服务器端的删除代码
//通过关键信息查找ID
function TServiceMethods.DelCMDHis(const aCMD_ID: string): boolean;
var
vCMDHis: TCMDHis;
begin
Result := false;
vCMDHis := TCMDHis.Create(RestServer.ORM, 'GUID=?', [aCMD_ID]);
if vCMDHis.ID > 0 then
Result := RestServer.ORM.Delete(TCMDHis, vCMDHis.ID);
end;
//直接使用ID
function TServiceMethods.DelCMDHisID(const aID: integer): boolean;
var
vCMDHis: TCMDHis;
begin
Result := false;
if aID > 0 then
Result := RestServer.ORM.Delete(TCMDHis, aID);
end;