随笔分类 - midas中间层
midas中间层的完整实现
摘要:咏南CS插件开发框架同时支持2层和3层开发了,是的一套代码既支持2层也能3层开发。 你要做的仅仅是在配置文件里面设置一个2层还是3层的开关控制一下。 对,就这么简单!
阅读全文
摘要:购买咏南DATASNAP中间件送CS插件开发框架和BS开发框架,CS、BS开发框架共享同一个中间件。价格从优! 中间件可供DELPHI6~DELPHI XE8开发的客户端调用! CS开发框架截图: BS开发框架截图:
阅读全文
摘要:使用OLEVARIANT可以序列任何类型的对象。下面的代码序列TDATASET。procedure TForm1.DatasetToVariant(var varResultSet: OleVariant; ADataset : TDataset);var m : Integer; nRecords, nColumns, nCurRec : Integer;begin nRecords := -1; nColumns := -1; try { Create the array... } nColumns := Max(0, ADataset.FieldCount-1); nRecords :=
阅读全文
摘要:上传客户端的CLIENTDATASET.delta到服务器的clientdataset.data,服务端解析clientdataset的数据生成相应的SQL语句。相对于直接调用datasetprovider.applyupdates()方法提交数据而言,前者的可控性更强,对于某些要求灵活性很强的场合,前者可能是必须的提交方式。procedure TBaseService.ApplyUpdates(const Delta: OleVariant; TableName, KeyField: WideString);var Flag: Boolean;begin if VarIsNull(Delta
阅读全文
摘要:网上有一些讲以RAD方式设置主从表的演示,但是在实际当中不实用。function TsvrDM.ApplyUpdates(const ModuleId: WideString;sqlId:ShortInt; Delta0, Delta1, Delta2, Delta3: OleVariant): Shortint;const sql='Select * from %s where 1<>1'; var aData: array of OleVariant; i:integer; conn:TADOConnection; qry:TADOQuery; dsp:TDat
阅读全文
摘要:TCLIENTDATASET.DATA, TCLIENTDATASET.DELTA, TDATASETPROVIDER.DATA,它们的DATA属性的类型都是OLEVARIANT。中间层和客户端之间通过OLEVARIANT来传递数据集的数据。为了提高数据传输的效率,发送方在传输之前可以先压缩数据,然后把压缩的数据发送给接收方。接收方收到发送方送来的压缩数据,先进行数据解压。使用开源的ZLIB进行数据的压缩和解压。XE2已经自带此控件,需要引用system.zlib单元。原理:将OLEVARIANT数据流化,然后对流进行压缩,还原成OLEVARIANT以后再发送。procedure Stream
阅读全文
摘要:midas支持使用OLEVARIANT序列化对象,最新的DATASNAP支持使用OLEVARAINT和JSON来序列化对象。下面的代码演示OLEVARINAT序列化TPARAMS, TPARAMETERS对象。OLEVARIANT本质上是一个BYTE数组。还原TPARAMS对象procedure VariantToParams(input:OleVariant;par:TParams);// TParam 's property: fieldType, paramName, ParamType, value, size// paramType default value ptinput
阅读全文
摘要:最近在写一个基于XE2 DATASNAP的中间层,以前也写过基于DCOM的MIDAS中间层,看到网上一些同仁对中间层的提问。我摘录俩个典型的提问,如下:第一个提问:Midas三层程序,如何支持大量用户同时请求连接?系统结构: TClientDataSet -> TSocketServer -> scktsrvr.exe -> RemoteDataModule -> ADO 要求:允许500-1000个客户端同时“请求”连接,服务器和客户端均不能死掉。现状:在现有的程序中,只要同时“请求”连接的客户端达到一个较大的数量,例如80或100,应用服务器就停止响应了。客户端尝试
阅读全文
摘要:要深刻理解TclientDataSet的两个重要属性:Data、Delta要深刻理解并区分开Tfield的4个重要属性:Value、OldValue、CurValue、NewValueTField的事件触发顺序: 显示时触发:OnGetText 编辑时触发:OnSetText->OnValidate->OnChange (1) OnGetText事件是访问DisplayText或Text时触发。如果数据库中存储的值和要显示给用户看的值不一样,如数据库中存储的是bool型的值,要显示给用户“真”或“假”,可以在这个事件里进行处理。 (2) OnSetText事件是设置字段的值时触发。
阅读全文
摘要:TField.ProviderFlags,这对于组 SQL 来说至关重要!ProviderFlags 是 TProviderFlag 的集合,我们来看看 ProviderFlags 可以包含哪些元素 元素名称 说明 备注 pfInUpdate INSERT / UPDATE 要包含此字段 实际上会不会包含,要看字段值有没有变动而定 pfInWhere UPDATE / DELETE 时要加入 WHERE 实际上会不会加入 WHERE,要看字段值有没有变动而定 pfInKey UPDATE / DELETE 时要加入 WHERE,以及 DataSet 内数据的重复检查 一定会加入WHERE p.
阅读全文
摘要:中间层服务对象全部作成对象池,因此中间层负载能力非常强大。所有池中的对象都是针对事件而不是某一个客户端。当一个事件执行完成,它所使用的对象会立即放回池中,以等待其它事情发生时再使用。对象只有在事件发生的那一瞬间被占用,这样对象的使用效率是很高的。
阅读全文
摘要:unit MidServer_TLB;// ************************************************************************ //// WARNING // ------- // The types declared in this file were generated from data read from a // Type Library. If this type library is explicitly or indirectly (via // another type library referring to t
阅读全文
摘要:unit uMain;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, TlHelp32, ExtCtrls, DB, DBClient, Grids, DBGrids, ADODB, Provider, AppEvnts;type TForm1 = class(TForm) DataSource1: TDataSource; DBGrid1: TDBGrid; QryPooling: TADOQuery; DataSetProv
阅读全文
摘要:unit uDM;interface{$WARN SYMBOL_PLATFORM OFF}uses SysUtils, Classes, Controls,DB, DBClient, MConnect, SConnect, Dialogs, Variants, ADODB, IniFiles, Forms, MidServer_TLB, uFun;type TSvrRec = record // socketConnection's property Address: string; Port: Integer; ServerName: string; end; Tdm = class
阅读全文
摘要:unit uFun;interfaceuses SysUtils, Variants, db, adodb, Classes, EncdDecd;function ParametersToVariant(par:TParameters): OleVariant;procedure VariantToParameters(input:OleVariant;par:TParameters);function ParamsToVariant(par:TParams): OleVariant;procedure VariantToParams(input:OleVariant;par:TParams)
阅读全文
摘要:unit uTestSvr;{$WARN SYMBOL_PLATFORM OFF}interfaceuses Windows, Messages, SysUtils, Classes, ComServ, ComObj, VCLCom, DataBkr, DBClient, MidServer_TLB, StdVcl, DB, ADODB, Provider, Variants, Forms, ThreadComLib;type TsvrDM = class(TRemoteDataModule, ITest) private { Private declarations } function G
阅读全文
摘要:// TThreadedClassFactory.Create (ComServer, TsvrDM, CLASS_Test, // create com thread pooling// ciMultiInstance);unit ThreadComLib;{$IFDEF VER100}{$DEFINE D3}{$ENDIF}interfaceuses Windows, ActiveX, Classes, ComObj, Controls, ExtCtrls, Grids, Variants, VCLCom, forms ;{ General COM threading types }typ
阅读全文
摘要:unit ProcPool;interfaceuses Classes, Windows, SysUtils, ADODB, forms;type TProcPool = class(TObject) private FObjList:TThreadList; FTimeout: Integer; FMaxCount: Integer; FSemaphore: Cardinal; function CreateNewInstance(List:TList): TADOStoredProc; function GetLock(List:TList;Index: Integer): Boolean
阅读全文
摘要:unit DSPPool;interfaceuses Classes, Windows, SysUtils, Provider, forms;type TDSPPool = class(TObject) private FObjList:TThreadList; FTimeout: Integer; FMaxCount: Integer; FSemaphore: Cardinal; function CreateNewInstance(List:TList): TDatasetProvider; function GetLock(List:TList;Index: Integer): Bool
阅读全文
摘要:unit AdoqueryPool;interfaceuses Classes, Windows, SysUtils, ADODB, forms;type TADOQueryPool = class(TObject) private FObjList:TThreadList; FTimeout: Integer; FMaxCount: Integer; FSemaphore: Cardinal; function CreateNewInstance(List:TList): TADOQuery; function GetLock(List:TList;Index: Integer): Bool
阅读全文