客户端开发使用
客户端开发使用
1)delphi7等老版本开发的客户端
参考“client(delphi7)”例子。使用TIdHttp,TClientDataSet。适合改造delphi7等老版本开发的2层客户端升级为3层。可匹配delphi非unicode版本开发的客户端。

接口例程:
unit Unit1; /// <author>cxg 2025-3-2</author> interface uses //my-- server.api, core.binary, //system-- dialogs, SysUtils, forms, DB, DBClient, ExtCtrls, StdCtrls, Controls, Grids, DBGrids, Classes; type TForm1 = class(TForm) btn: TButton; dbgrd1: TDBGrid; dbgrd2: TDBGrid; ds1: TDataSource; ds2: TDataSource; Timer1: TTimer; Button1: TButton; ClientDataSet1: TClientDataSet; ClientDataSet2: TClientDataSet; Button7: TButton; Image1: TImage; Memo1: TMemo; Button5: TButton; Button6: TButton; Button2: TButton; Button3: TButton; Button4: TButton; Button8: TButton; Button9: TButton; Button10: TButton; Button11: TButton; OpenDialog1: TOpenDialog; procedure btnClick(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button7Click(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure Button5Click(Sender: TObject); procedure Button6Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button8Click(Sender: TObject); procedure Button10Click(Sender: TObject); procedure Button9Click(Sender: TObject); procedure Button11Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.btnClick(Sender: TObject); // 多表查询 begin query('1', ['select * from tgoods', 'select * from tunit'], [ClientDataSet1, ClientDataSet2]); end; procedure TForm1.Button10Click(Sender: TObject); //下载文件 var LRequest, LResponse: TData; LFile: TStream; LFileName: string; begin LFileName := '1.exe'; LRequest := TData.Create; LRequest.I['count'] := 1; LRequest.S['filename0'] := LFileName; LResponse := downloadFile(LRequest); if LResponse.B['success'] then begin LFile := LResponse.Stream['file0']; TMemoryStream(LFile).SaveToFile('c:\' + LFileName); LFile.Free; ShowMessage('下载文件成功'); end else ShowMessage('下载文件失败'); LRequest.Free; LResponse.Free; end; procedure TForm1.Button1Click(Sender: TObject); // 多表保存 begin save('1', ['tgoods', 'tunit'], [' ', ' '], [ClientDataSet1, ClientDataSet2]); end; procedure TForm1.Button2Click(Sender: TObject); //雪花ID var LId: Int64; begin snowflakeID(LId, 1, 1); Memo1.Lines.Add(inttostr(LId)); end; procedure TForm1.Button3Click(Sender: TObject); //验证码 var LCode: string; LStream: TStream; begin LStream := TMemoryStream.Create; verifyCode(LCode, LStream); Memo1.Lines.Add(LCode); TMemoryStream(LStream).SaveToFile('c:\1.bmp'); Image1.Picture.LoadFromFile('c:\1.bmp'); LStream.free; end; procedure TForm1.Button4Click(Sender: TObject); //存储过程(多数据集) var LRequest, LResponse: Tdata; begin LRequest := Tdata.Create; LRequest.S['dbid'] := '1'; LRequest.S['procname'] := 'gettables'; LResponse := storedproc(LRequest); ClientDataSet1.DisableControls; ClientDataSet1.Data := LResponse.V['dataset0']; ClientDataSet1.EnableControls; ClientDataSet2.DisableControls; ClientDataSet2.Data := LResponse.V['dataset1']; ClientDataSet2.EnableControls; LRequest.Free; LResponse.Free; end; procedure TForm1.Button5Click(Sender: TObject); // 单表查询 begin query('1', ['select * from tgoods where goodsname=''秋冬四件套'''], [ClientDataSet1]); end; procedure TForm1.Button6Click(Sender: TObject); // 单表保存 begin save('1', ['tgoods'], [' '], [ClientDataSet1]); end; procedure TForm1.Button7Click(Sender: TObject); //execsql begin execsql('1', 'delete from tgoods where goodsid=''5'''); end; procedure TForm1.Button8Click(Sender: TObject); //存储过程(单数据集) var LRequest, LResponse: Tdata; begin LRequest := Tdata.Create; LRequest.S['dbid'] := '1'; LRequest.S['procname'] := 'sp_9'; LRequest.S['@goodsid'] := '100036'; LResponse := storedproc(LRequest); ClientDataSet1.DisableControls; ClientDataSet1.Data := LResponse.V['dataset0']; ClientDataSet1.EnableControls; LRequest.Free; LResponse.Free; end; procedure TForm1.Button9Click(Sender: TObject); //上传文件 var LData: TData; LStream: TStream; begin if OpenDialog1.Execute then begin LData := TData.Create; LData.I['count'] := 1; LData.S['filename0'] := ExtractFileName(OpenDialog1.FileName); LStream := TFileStream.Create(OpenDialog1.FileName, fmOpenRead or fmShareExclusive); LData.Stream['file0'] := LStream; if uploadFile(LData) then ShowMessage('上传文件成功') else ShowMessage('上传文件失败'); LData.Free; LStream.Free; end; end; procedure TForm1.Timer1Timer(Sender: TObject); begin btnClick(nil); end; procedure TForm1.Button11Click(Sender: TObject); var sql: String; code: string; head: string; len: Integer; isbill: string; begin Query('1', ['select * from tautocode where billname=''采购订单'''], [clientdataset1]); code := clientdataset1.fieldbyname('billcode').AsString; head := clientdataset1.fieldbyname('billhead').AsString; len := clientdataset1.fieldbyname('codelen').AsInteger; isbill := clientdataset1.fieldbyname('isbill').AsString; while Length(code) < len do code := '0' + code; // if isbill = '是' then Memo1.Lines.Add(head + FormatDateTime('yymmdd', now) + code); // else // Result := head + code; end; end.
2)delphi客户端使用TFDMemTable
参考“client(fdmemtable)”例子。使用TIdHttp(TNetHttpClient), TFDMemTable。适合delphi2009+开发的客户端。
可匹配delphi开发的APP,CS,UNIGUI等程序。

接口例程:
unit Unit1; /// <author>cxg 2025-4-20</author> interface uses // my-- server.api, fdmemtable.help, core.binary, // system-- dialogs, System.SysUtils, Data.DB, forms, Vcl.ExtCtrls, Vcl.Controls, Vcl.Grids, Vcl.DBGrids, System.Classes, Vcl.StdCtrls, FireDAC.Stan.Intf, FireDAC.Stan.Option, FireDAC.Stan.Param, FireDAC.Stan.StorageBin, FireDAC.Stan.Error, FireDAC.DatS, FireDAC.Phys.Intf, FireDAC.DApt.Intf, FireDAC.Comp.DataSet, FireDAC.Comp.Client; type TForm1 = class(TForm) btn: TButton; dbgrd1: TDBGrid; dbgrd2: TDBGrid; ds1: TDataSource; ds2: TDataSource; Timer1: TTimer; Button1: TButton; Button7: TButton; Image1: TImage; Memo1: TMemo; Button5: TButton; Button6: TButton; FDMemTable1: TFDMemTable; FDMemTable2: TFDMemTable; Button2: TButton; Button3: TButton; Button4: TButton; Button8: TButton; Button9: TButton; Button10: TButton; Button11: TButton; OpenDialog1: TOpenDialog; procedure btnClick(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button7Click(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure Button5Click(Sender: TObject); procedure Button6Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button8Click(Sender: TObject); procedure Button9Click(Sender: TObject); procedure Button10Click(Sender: TObject); procedure Button11Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.btnClick(Sender: TObject); // 多表查询 var LRpc: Trpc; begin LRpc.Query('1', ['select * from tgoods', 'select * from tunit'], [FDMemTable1, FDMemTable2]); end; procedure TForm1.Button10Click(Sender: TObject); //存储过程 var LRequest, LResponse: Tdata; LStream: TStream; begin LRequest := Tdata.Create; LRequest.S['dbid'] := '1'; LRequest.S['procname'] := 'sp_9'; LRequest.S['@goodsid'] := '100036'; LResponse := TRpc.storedproc(LRequest); LStream := LResponse.STREAM['dataset0']; FDMemTable1.DisableControls; FDMemTable1.LoadFromStream(LStream); FDMemTable1.EnableControls; LRequest.Free; LResponse.Free; LStream.Free; end; procedure TForm1.Button11Click(Sender: TObject); var sql: String; code: string; head: string; len: Integer; isbill: string; cdscode: Tfdmemtable; begin cdscode := Tfdmemtable.Create(nil); try sql := 'update tautocode set billcode=billcode+1 where billname=' + QuotedStr('采购订单'); TRpc.execsql('1', sql); sql := 'select * from tautocode where billname=' + QuotedStr('采购订单'); cdscode.Query('1', sql); code := cdscode.fieldbyname('billcode').AsString; head := cdscode.fieldbyname('billhead').AsString; len := cdscode.fieldbyname('codelen').AsInteger; isbill := cdscode.fieldbyname('isbill').AsString; while Length(code) < len do code := '0' + code; // if isbill = '是' then Memo1.Lines.Add(head + FormatDateTime('yymmdd', now) + code); // else // Result := head + code; finally cdscode.Free; end; end; procedure TForm1.Button1Click(Sender: TObject); // 多表保存 begin if TRpc.save('1', ['tgoods', 'tunit'], [' ', ' '], [FDMemTable1, FDMemTable2]) then begin FDMemTable1.MergeChangeLog; FDMemTable2.MergeChangeLog; ShowMessage('保存成功'); end else begin FDMemTable1.Cancel; FDMemTable2.Cancel; ShowMessage('保存失败'); end; end; procedure TForm1.Button2Click(Sender: TObject); // 雪花ID var LId: Int64; LRpc: Trpc; begin LRpc.snowflakeID(LId, 1, 1); Memo1.Lines.Add(LId.ToString); end; procedure TForm1.Button3Click(Sender: TObject); // 验证码 var LCode: string; LStream: TStream; LRpc: Trpc; begin LStream := TMemoryStream.Create; LRpc.verifyCode(LCode, LStream); Memo1.Lines.Add(LCode); Image1.Picture.LoadFromStream(LStream); LStream.Free; end; procedure TForm1.Button4Click(Sender: TObject); // 上传文件 var LData: TData; LStream: TStream; begin if OpenDialog1.Execute then begin LData := TData.Create; LData.I['count'] := 1; LData.S['filename0'] := ExtractFileName(OpenDialog1.FileName); LStream := TFileStream.Create(OpenDialog1.FileName, fmOpenRead or fmShareExclusive); LData.Stream['file0'] := LStream; if TRpc.uploadFile(LData) then ShowMessage('上传文件成功') else ShowMessage('上传文件失败'); LData.Free; LStream.Free; end; end; procedure TForm1.Button5Click(Sender: TObject); // 单表查询 begin FDMemTable1.query('1', 'select * from tgoods'); end; procedure TForm1.Button6Click(Sender: TObject); // 单表保存 begin if FDMemTable1.save('1', 'tgoods', ' ') then begin FDMemTable1.MergeChangeLog; ShowMessage('保存成功'); end else begin FDMemTable1.Cancel; ShowMessage('保存失败'); end; end; procedure TForm1.Button7Click(Sender: TObject); // execsql begin if FDMemTable1.execsql('1', 'delete from tunit where unitid=''1''') then ShowMessage('execsql成功') else ShowMessage('execsql失败'); end; procedure TForm1.Button8Click(Sender: TObject); // 下载文件 var LRequest, LResponse: TData; LFile: TStream; LFileName: string; begin LFileName := '1.exe'; LRequest := TData.Create; LRequest.I['count'] := 1; LRequest.S['filename0'] := LFileName; LResponse := TRpc.downloadFile(LRequest); if LResponse.B['success'] then begin LFile := LResponse.Stream['file0']; TMemoryStream(LFile).SaveToFile('c:\' + LFileName); LFile.Free; ShowMessage('下载文件成功'); end else ShowMessage('下载文件失败'); LRequest.Free; LResponse.Free; end; procedure TForm1.Button9Click(Sender: TObject); // 存储过程(多数据集) var LRequest, LResponse: TData; LStream, LStream2: TStream; begin LRequest := Tdata.Create; LRequest.S['dbid'] := '1'; LRequest.S['procname'] := 'gettables'; LResponse := TRpc.storedproc(LRequest); LStream := LResponse.STREAM['dataset0']; LStream2 := LResponse.STREAM['dataset1']; FDMemTable1.DisableControls; FDMemTable1.LoadFromStream(LStream); FDMemTable1.EnableControls; FDMemTable2.DisableControls; FDMemTable2.LoadFromStream(LStream2); FDMemTable2.EnableControls; LRequest.Free; LResponse.Free; LStream.Free; LStream2.Free; end; procedure TForm1.Timer1Timer(Sender: TObject); begin btnClick(nil); end; end.
3)delphi客户端使用TClientDataSet
参考“client(clientdataset)”,使用TIdHttp(TNetHttpClient),TClientDataSet。适合delphi2009+开发的客户端。
可匹配delphi开发的APP,CS,UNIGUI等程序。

接口例程:
unit Unit1; /// <author>cxg 2025-4-20</author> interface uses // my-- cds.help, server.api, core.binary, // system-- dialogs, System.SysUtils, Data.DB, forms, Vcl.ExtCtrls, Vcl.Controls, Vcl.Grids, Vcl.DBGrids, System.Classes, Vcl.StdCtrls, FireDAC.Stan.Intf, Datasnap.DBClient; type TForm1 = class(TForm) btn: TButton; dbgrd1: TDBGrid; dbgrd2: TDBGrid; ds1: TDataSource; ds2: TDataSource; Timer1: TTimer; Button1: TButton; ClientDataSet1: TClientDataSet; ClientDataSet2: TClientDataSet; Button7: TButton; Image1: TImage; Memo1: TMemo; Button5: TButton; Button6: TButton; Button2: TButton; Button3: TButton; Button4: TButton; Button8: TButton; Button9: TButton; Button10: TButton; Button11: TButton; OpenDialog1: TOpenDialog; procedure btnClick(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button7Click(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure Button5Click(Sender: TObject); procedure Button6Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button8Click(Sender: TObject); procedure Button10Click(Sender: TObject); procedure Button9Click(Sender: TObject); procedure Button11Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.btnClick(Sender: TObject); // 多表查询 begin TRpc.Query('1', ['select * from tgoods', 'select * from tunit'], [ClientDataSet1, ClientDataSet2]); end; procedure TForm1.Button10Click(Sender: TObject); // 下载文件 var LRequest, LResponse: TData; LFile: TStream; LFileName: string; begin LFileName := '1.exe'; LRequest := TData.Create; LRequest.I['count'] := 1; LRequest.S['filename0'] := LFileName; LResponse := TRpc.downloadFile(LRequest); if LResponse.B['success'] then begin LFile := LResponse.Stream['file0']; TMemoryStream(LFile).SaveToFile('c:\' + LFileName); LFile.Free; ShowMessage('下载文件成功'); end else ShowMessage('下载文件失败'); LRequest.Free; LResponse.Free; end; procedure TForm1.Button11Click(Sender: TObject); var sql: String; code: string; head: string; len: Integer; isbill: string; cdscode: TClientDataSet; begin cdscode := TClientDataSet.Create(nil); try sql := 'update tautocode set billcode=billcode+1 where billname=' + QuotedStr('采购订单'); TRpc.execsql('1', sql); sql := 'select * from tautocode where billname=' + QuotedStr('采购订单'); cdscode.Query('1', sql); code := cdscode.fieldbyname('billcode').AsString; head := cdscode.fieldbyname('billhead').AsString; len := cdscode.fieldbyname('codelen').AsInteger; isbill := cdscode.fieldbyname('isbill').AsString; while Length(code) < len do code := '0' + code; // if isbill = '是' then Memo1.Lines.Add(head + FormatDateTime('yymmdd', now) + code); // else // Result := head + code; finally cdscode.Free; end; end; procedure TForm1.Button1Click(Sender: TObject); // 多表保存 begin TRpc.save('1', ['tgoods', 'tunit'], [' ', ' '], [ClientDataSet1, ClientDataSet2]); end; procedure TForm1.Button2Click(Sender: TObject); // 雪花ID var LId: Int64; begin TRpc.snowflakeID(LId, 1, 1); Memo1.Lines.Add(LId.ToString); end; procedure TForm1.Button3Click(Sender: TObject); // 验证码 var LCode: string; LStream: TStream; begin LStream := TMemoryStream.Create; TRpc.verifyCode(LCode, LStream); Memo1.Lines.Add(LCode); Image1.Picture.LoadFromStream(LStream); LStream.Free; end; procedure TForm1.Button4Click(Sender: TObject); // 存储过程(多数据集) var LRequest, LResponse: TData; begin LRequest := TData.Create; LRequest.S['dbid'] := '1'; LRequest.S['procname'] := 'gettables'; LResponse := TRpc.storedproc(LRequest); ClientDataSet1.DisableControls; ClientDataSet1.Data := LResponse.V['dataset0']; ClientDataSet1.EnableControls; ClientDataSet2.DisableControls; ClientDataSet2.Data := LResponse.V['dataset1']; ClientDataSet2.EnableControls; LRequest.Free; LResponse.Free; end; procedure TForm1.Button5Click(Sender: TObject); // 单表查询 begin ClientDataSet1.Query('1', 'select * from tgoods'); end; procedure TForm1.Button6Click(Sender: TObject); // 单表保存 begin ClientDataSet1.save('1', 'tgoods', ' '); end; procedure TForm1.Button7Click(Sender: TObject); // execsql begin ClientDataSet1.execsql('1', 'delete from tgoods where goodsid=''5'''); end; procedure TForm1.Button8Click(Sender: TObject); // 存储过程(单数据集) var LRequest, LResponse: TData; begin LRequest := TData.Create; LRequest.S['dbid'] := '1'; LRequest.S['procname'] := 'sp_9'; LRequest.S['@goodsid'] := '100036'; LResponse := TRpc.storedproc(LRequest); ClientDataSet1.DisableControls; ClientDataSet1.Data := LResponse.V['dataset0']; ClientDataSet1.EnableControls; LRequest.Free; LResponse.Free; end; procedure TForm1.Button9Click(Sender: TObject); // 上传文件 var LData: TData; LStream: TStream; begin if OpenDialog1.Execute then begin LData := TData.Create; LData.I['count'] := 1; LData.S['filename0'] := ExtractFileName(OpenDialog1.FileName); LStream := TFileStream.Create(OpenDialog1.FileName, fmOpenRead or fmShareExclusive); LData.Stream['file0'] := LStream; if TRpc.uploadFile(LData) then ShowMessage('上传文件成功') else ShowMessage('上传文件失败'); LData.Free; LStream.Free; end; end; procedure TForm1.Timer1Timer(Sender: TObject); begin btnClick(nil); end; end.
4)web api
中间件提供web api服务接口,请求和应答均使用json序列,方便与web和其他语言开发的3方程序进行对接。
中间件提供了一个例子:webapi包。
如何对接?参看中间件doc\目录下面的文档。

本文来自博客园,作者:{咏南中间件},转载请注明原文链接:https://www.cnblogs.com/hnxxcxg/p/18853470

浙公网安备 33010602011771号