一,主要通过4个接口函数来操作后端数据库(TCP通讯):
【GetCommonDataSet函数】:调用后端定义的SQL语句(sql文件章节有介绍)来操作数据库并返回OleVariant 类型数据集 然后赋给ClientDataSet.Data,然后可直接操作ClientDataSet了。这样会更少破坏delphi 便捷性;若是旧系统升级改动更少。企业内部系统很大一部分是基于内网或云服务器的,传输效率问题不大。
代码范例:
var
vData: OleVariant;
sqlId, strParaems,sqlFlag: string;
sErrorMsg: string;
JsnParaems: ISuperObject;
begin
try
//后端定义sqlId(xml文件跟节点+第3个节点)
sqlId := 'F_poinfoc_master';
//json格式参数;必须要与sql里面的参数名称一致
JsnParaems := TSuperObject.Create(stObject);
JsnParaems.S['startdate'] := '2021-10-01';
JsnParaems.S['enddate'] := '2021-10-30';
JsnParaems.S['department'] := 'A车间';
strParaems:= JsnParaems.AsString;
//默认执行 ssql 节点的sql语句 ; sqlFlag='q'执行qsql节点的语句
sqlFlag:='';
//返回错误信息
sErrorMsg:='';
//vData 返回OleVariant 类型的数据集 (若有返回值) CDS1= ClientDataSet
//ser =生产单服务端代理类单元
if ser.GetCommonDataSet(vData, sqlId, sqlFlag, strParaems, sErrorMsg) then
CDS1.Data := vData
else
showmessage(sErrorMsg);
finally
JsnParaems := nil;
end;
end;
【ExeCommonSqlText函数】软件开发过程中可能不得不需要执行一些前端自定义的sql语句,此函数就是执行前端传过来的sql,函数,存储过程并返回数据集值。
var
vData: OleVariant;
sqlText,dbid: string;
sErrorMsg: string;
haveResult:boolean;
begin
//自定义sql语句
sqlText := 'select top 111 * from S_SysOperLog where RowID>=11966';
//dbid 对应后端定义数据库id ;dbid='' 默认为ID=1的数据库
dbid:='';
//是否有数据集返回 (若为insert,update,delete =false)
haveResult:=true;
//返回错误信息
sErrorMsg:='';
if ser.ExeCommonSqlText(vData, sqlText, dbid,haveResult, sErrorMsg) then
begin
//若没有返回值就无需此代码
CDS1.Data := vData;
end
else
showmessage(sErrorMsg);
end;
【SaveDataset函数】此函数直接提交ClientDataSet 的 Delta数据集(Delta; 里面就是ClientDataSet 增删改的数据集合); 服务端xml文件ClientDataSet1节点必须要定义isql,usql ,dsql 语句。此函数的好处就是前端人员无需知道table细节(如主键,更新,插入,删除逻辑)。
var
vData: OleVariant;
sqlid: string;
sErrorMsg: string;
begin
//检查是否有未提交的数据并提交
ClientDataSet1.CheckBrowseMode;
//判断数据集是否有改动
if ClientDataSet1.ChangeCount > 0 then
begin
//错误信息返回
sErrorMsg:='';
//对应的ssql节点值
sqlid:='F_PoInfoClientDataSet1';
{Delta:表示ClientDataSet 增删改的数据集(增删改) ;
服务端ClientDataSet1节点必须要定义isql,usql ,dsql 语句
}
vData := ClientDataSet1.Delta;
if ser.SaveDataset(vData, sErrorMsg) then
showmessage('保存成功!')
else
showmessage(sErrorMsg);
end;
end;
【GetProcWithOutParam函数】执行带输出参数的存储过程 (后端sql定义规则请看sql操作章节)
var
sqlId, strParaems, outstrParaems: string;
sErrorMsg: string;
JsnParaems: ISuperObject;
begin
JsnParaems := TSuperObject.Create(stObject);
try
//后端定义的存储过程对应的sqlId
sqlId := 'F_Systemc_procedure';
//输入参数赋值
JsnParaems.S['@poNo'] := 'POA001';
JsnParaems.S['@dept'] := 'A车间';
strParaems := JsnParaems.AsString;
//输出参数outstrParaems 返回的是json格式
outstrParaems:='';
//错误信息返回
sErrorMsg:='';
//开始执行
if ser.GetProcWithOutParam(sqlId, strParaems, outstrParaems, sErrorMsg) then
begin
//这里处理返回结果
Memo1.Lines.Add(outstrParaems);
end
else showmessage(sErrorMsg);
finally
JsnParaems := nil;
end;
end;