上一页 1 ··· 147 148 149 150 151 152 153 154 155 ··· 203 下一页
摘要: 上传客户端的CLIENTDATASET.delta到服务器的clientdataset.data,服务端解析clientdataset的数据生成相应的SQL语句。相对于直接调用datasetprovider.applyupdates()方法提交数据而言,前者的可控性更强,对于某些要求灵活性很强的场合,前者可能是必须的提交方式。procedure TBaseService.ApplyUpdates(const Delta: OleVariant; TableName, KeyField: WideString);var Flag: Boolean;begin if VarIsNull(Delta 阅读全文
posted @ 2012-03-09 20:19 delphi中间件 阅读(5511) 评论(6) 推荐(0)
摘要: procedure LogInfo(msg: string);// 功能: 服务端日志var p: PChar;begin try GetMem(p, (Length(msg) + 1) * sizeof(char)); Move(msg[1], p^, (Length(msg) + 1) * sizeof(char)); PostMessage(Application.MainForm.Handle, WM_LOG, integer(p), 0); except Exit; end;end;procedure Tf_MainForm.Log(var msg: TMessage);var p: 阅读全文
posted @ 2012-03-05 22:54 delphi中间件 阅读(915) 评论(0) 推荐(1)
摘要: 新的datasnap使用INDY10的线程池。不管你知不知道,DATASNAP都是使用线程池了,这和MIDAS不同,MIDAS默认是没有线程池的。跟踪INDY10线程池类TIdSchedulerOfThreadPool的代码:procedure TIdSchedulerOfThreadPool.Init;begin inherited Init; Assert(FThreadPool<>nil); if not IsDesignTime then begin if PoolSize > 0 then begin with FThreadPool.LockList do try 阅读全文
posted @ 2012-03-03 22:52 delphi中间件 阅读(3765) 评论(0) 推荐(0)
摘要: 其实不论什么方法,归根揭底都是通过传递对象的指针来达到效果的。方法一:procedure SendString(strMSG: string);var Data: tagCOPYDATASTRUCT; pBuf: PChar;begin GetMem(pBuf, Length(strMSG) + 1); try ZeroMemory(pBuf, Length(strMSG) + 1); StrPCopy(pBuf, strMSG); Data.cbData:= Length(strMSG); Data.dwData:= Length(strMSG); Data.lpData:= pBuf; S 阅读全文
posted @ 2012-03-03 08:41 delphi中间件 阅读(903) 评论(0) 推荐(0)
摘要: 主控程序(通常是EXE程序),各插件(DLL/BPL),它们都是独立的工程,它们组成一个工程组。1. 主控程序和各插件工程中,BUILD WITH RUNTIME PACKAGE都勾选上。整个程序运行的时候,保障了所有的VCL对象只有唯一的一份,杜绝了VCL对象相互之间发生冲突的可能性。此种方式最为稳定和安全,建议使用此方式。但此种方式有一个缺点:发布程序的时候,DELPHI RTL包,第三方控件的BPL运行时包要一起打包发布,否则程序将不能运行。此种方式编译出来的EXE/DLL/BPL一般体积会比较小,往往只有几百K,因为运行时包没有编译进来。2. 主控程序和各插件工程中,BUILD WIT 阅读全文
posted @ 2012-02-26 15:26 delphi中间件 阅读(2416) 评论(1) 推荐(0)
摘要: 网上有一些讲以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 阅读全文
posted @ 2012-02-26 14:23 delphi中间件 阅读(2068) 评论(0) 推荐(1)
摘要: TCLIENTDATASET.DATA, TCLIENTDATASET.DELTA, TDATASETPROVIDER.DATA,它们的DATA属性的类型都是OLEVARIANT。中间层和客户端之间通过OLEVARIANT来传递数据集的数据。为了提高数据传输的效率,发送方在传输之前可以先压缩数据,然后把压缩的数据发送给接收方。接收方收到发送方送来的压缩数据,先进行数据解压。使用开源的ZLIB进行数据的压缩和解压。XE2已经自带此控件,需要引用system.zlib单元。原理:将OLEVARIANT数据流化,然后对流进行压缩,还原成OLEVARIANT以后再发送。procedure Stream 阅读全文
posted @ 2012-02-26 14:20 delphi中间件 阅读(1908) 评论(1) 推荐(1)
摘要: 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 阅读全文
posted @ 2012-02-26 14:04 delphi中间件 阅读(2076) 评论(0) 推荐(0)
摘要: 最近在写一个基于XE2 DATASNAP的中间层,以前也写过基于DCOM的MIDAS中间层,看到网上一些同仁对中间层的提问。我摘录俩个典型的提问,如下:第一个提问:Midas三层程序,如何支持大量用户同时请求连接?系统结构: TClientDataSet -> TSocketServer -> scktsrvr.exe -> RemoteDataModule -> ADO 要求:允许500-1000个客户端同时“请求”连接,服务器和客户端均不能死掉。现状:在现有的程序中,只要同时“请求”连接的客户端达到一个较大的数量,例如80或100,应用服务器就停止响应了。客户端尝试 阅读全文
posted @ 2012-02-25 09:30 delphi中间件 阅读(5999) 评论(1) 推荐(1)
摘要: 获得客户端的信息 记得datasnap 2009时,要得到客户端信息,非官方的方法,要去搞什么DSConnectEventObject.ChannelInfo.Id,弄成 TIdTCPConnection。xe2就好得多了。仍然是在DSServer的OnConnect 事件里,DSConnectEventObject.ChannelInfo.ClientInfo就是客户端的信息。能得到啥? 看代码 TDBXClientInfo = recordIpAddress: String;ClientPort: String;Protocol: String;AppName: String;end;也就 阅读全文
posted @ 2012-02-23 22:50 delphi中间件 阅读(1380) 评论(0) 推荐(1)
上一页 1 ··· 147 148 149 150 151 152 153 154 155 ··· 203 下一页