KBMMW SampleService/SampleClient方式传输数据集
马上周末了,趁着下午这会儿回顾一下这几天对旧项目的升级过程,一些重要但不常用的东西记录下来是很有必要的。其中一个项目中对KBMMW的远程数据通讯方式做了改进,利用SampleService/SampleClient方式传输数据集,以增加对底层数据通讯的可控性。
服务端代码示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
|
type TkbmMWSimpleService1 = class (TkbmMWSimpleService) private { Private declarations } protected { Protected declarations } function ProcessRequest( const Func: string ; const ClientIdent:TkbmMWClientIdentity; const Args: array of Variant):Variant; override; function PerformOpenSQL(ClientIdent:TkbmMWClientIdentity; const Args: array of Variant):Variant; virtual; public { Public declarations } {$IFNDEF CPP}class{$ENDIF} function GetFlags:TkbmMWServiceFlags; override; end ; //...省略 function TkbmMWSimpleService1 . ProcessRequest( const Func: string ; const ClientIdent:TkbmMWClientIdentity; const Args: array of Variant):Variant; var AFunc: string ; begin AFunc:=UpperCase(Func); if AFunc= 'OPENSQL' then Result:=PerformOpenSQL(ClientIdent,Args) else Result:= inherited ProcessRequest(Func,ClientIdent,Args); end ; function TkbmMWSimpleService1 . PerformOpenSQL(ClientIdent:TkbmMWClientIdentity; const Args: array of Variant):Variant; var sqlStr: string ; aQuery: TUniQuery; aconn: TkbmMWUNIDACConnection; memTable: TkbmMemTable; aStreamFormat: TkbmBinaryStreamFormat; begin Result := 0 ; sqlStr:=args[ 0 ]; aQuery := TUniQuery . Create( nil ); //uniquery,和两层的用法一样 aQuery . Options . QueryRecCount := True ; aconn := TkbmMWUNIDACConnection(DMunt . kbmMWUNIDACConnectionPool1 . GetBestConnection( True , 0 , nil , 10000 )); //取连接池中的连接 if aconn = nil then begin kbmMWRaiseServerException( '无可用的数据库连接' ); Exit; end ; aQuery . Connection := aconn . Database; aQuery . SQL . Text := sqlStr; if (mainform . PAL_mode_01 . Visible) then LogIOer . AddShow(ClientIdent . Username+ '执行SQL查询:' +aQuery . SQL . Text, 0 ); memTable := TkbmMemTable . Create( nil ); aStreamFormat := TkbmBinaryStreamFormat . Create( nil ); memTable . DefaultFormat := aStreamFormat; memTable . IndexFieldNames := '' ; memTable . SortFields := '' ; memTable . MasterSource := nil ; try try aQuery . Open; //查询 Result := aQuery . RecordCount; //返回记录条数 except on E:Exception do begin kbmMWRaiseServerException(E . Message+ ',异常语句:' +aQuery . SQL . Text); //抛异常到客户端 Exit; end ; end ; memTable . LoadFromDataSet(aQuery,[mtcpoStructure,mtcpoProperties]); //复制数据集进KbMemTable memTable . SaveToStreamViaFormat(ResultStream,aStreamFormat); //按照指定流格式存入结果流ResultStream finally aconn . UnlockConnection; aQuery . Free; memTable . Free; aStreamFormat . Free; end ; end ; |
客户端代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
function openSql(Sqlstr: string ; var Ds:TDataSet; var Rs: string ): integer ;stdcall; var args: array [ 0..1 ] of Variant; begin Result := 0 ; Rs := '执行成功' ; if assigned(kbmMWSimpleClient1) then begin try args[ 0 ]:= Sqlstr; //SQL语句 Result := kbmMWSimpleClient1 . Request( 'TkbmMWSimpleService1' , '' , 'openSql' ,args); //SimpleClient执行请求 kbmMemTable . EmptyTable; //清空内存表 kbmMemTable . LoadFromStreamViaFormat(kbmMWSimpleClient1 . ResultStream,aStreamFormat); //将结果流复制进内存表 ds := kbmMemTable; //返回dataset(kbmMemTable继承自Tdataset) except on E:Exception do begin Result := - 1 ; rs := errorInfo(E . Message); if FIsLog then Writelog(rs); end ; end ; end else begin Result := - 1 ; //未执行初始化操作 Rs := '远程数据通讯接口未执行初始化操作' end ; end ; |
核心代码就这些,相信用到的人能够看明白。同理,可以利用这种方式实现二进制文件流(如:图像等)的传输,不再赘述。
另外,有一个小问题折磨了我一下午,提醒大家一下,希望大家不要像我一样粗心:
有两个类:TkbmBinaryStreamFormat(kbmMemBinaryStreamFormat.pas)、TkbmMWBinaryStreamFormat(kbmMWBinaryStreamFormat.pas)很容易混淆(正确用法见上述代码),而且一旦混淆,会造成KbmMeMTable在流的处理过程中出错。
http://www.pfeng.org/archives/385
KBMMW SampleService/SampleClient方式传输数据集的更多相关文章
- Node.js初探之GET方式传输
Node.js初探之GET方式传输 例子:form用GET方法向后台传东西 html文件: <form action="http://localhost:8080/aaa" ...
- 流,用声明性的方式处理数据集 - 读《Java 8实战》
引入流 Stream API的代码 声明性 更简洁,更易读 可复合 更灵活 可并行 性能更好 流是什么? 它允许以声明方式处理数据集合 遍历数据集的高级迭代器 透明地并行处理 简短定义:从支持数据处理 ...
- C# Post方式传输报文,和处理响应
public string DoPost(string url, string data) { HttpWebRequest req = GetWebRequest(url, "POST&q ...
- Node.js初探之POST方式传输
小知识:POST比GET传输的数据量大很多 POST发数据--"分段" 实例: 准备一个form.html文件: <!DOCTYPE html> <html> ...
- ASP.NET WebServce项目下添加Http服务,支持Get,Post请求方式;传输格式json/xml
由于WEBServce老项目中需要增添新的接口,而且添加的接口不希望被其它项目以引用Servces方式使用. 那么得在现有Service项目中添加Http请求方式来实现系统间数据交互.只需要告知请求地 ...
- http使用formData方式传输文件请求
转载请注明出处: 项目中有遇到http使用formData请求传输文件,在此记录一下 1.依赖jar包: <dependency> <groupId>org.apache.ht ...
- 用socket方式传输Image和Sound文件
import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.Obje ...
- cache支持single/increment/increment4三种方式传输
1.cache bypass signle---data length 已知 increment ---data length 不知 用 last data address 结束数据传输 2.cac ...
- json和jsonp的传输方式
jsonp传输会解决跨域的问题 $.ajax({ async: false, /* url: "http://127.0.0.1:8080/2015020601/background/mea ...
随机推荐
- CodeForces 154B- Colliders
预处理...由于10^5<2^20..所以每个数的质因子个数最多20个..为了避免重复运算..将素有数的质因子打表出来... 两个数如果互质..那么他们的最大公约数为1..反过来说..两个数如果 ...
- telnet登陆路由器。。。
登陆路由有两种方式.一种是console,还有一种是使用telnet,由于我电脑是win7,不支持console.也懒得装软件,就使用telnent为例. 一.开启telnetclient 对于XP. ...
- Node.js笔记4
4. 文件系统 fs fs模块是文件操作的封装,提供了同步跟异步操作2个版本 * fs.readFile(filename,[encoding],[callback(err,data)]) 是最简单的 ...
- iOS中UIWebView使用JS交互 - 机智的新手
iOS中偶尔也会用到webview来显示一些内容,比如新闻,或者一段介绍.但是用的不多,现在来教大家怎么使用js跟webview进行交互. 这里就拿点击图片获取图片路径为例: 1.测试页面html & ...
- 关于一个wpf中的定时器
http://www.cnblogs.com/royenhome/archive/2010/01/24/1655168.html
- mysql 创建表字段类型笔记
1.字段联合唯一,unique(ServerVersion , MobileVersion, MobileType) .并且mysql设置多个字段为主键是起不到约束唯一的作用. 2.二进制用 BLOB ...
- C++中的内存对齐
在我们的程序中,数据结构还有变量等等都需要占有内存,在很多系统中,它都要求内存分配的时候要对齐,这样做的好处就是可以提高访问内存的速度. 我们还是先来看一段简单的程序: 程序一 1 #include ...
- HDU 3466 Proud Merchants
题目大意:现在给出商品,有三个参数,记为pi,qi,vi,vi是商品的在你心里价值,pi是商品的价格,qi是你要买商品的时候至少需要的钱然后求可得的最大价值. 单词积累:Merchants 商人 t ...
- TCP/IP笔记 四.应用层(1)——DNS
1. DNS DNS(Domain Name System ):域名系统,是因特网的一项核心服务,它作为可以将域名和IP地址相互映射的一个分布式数据库,能够使人更方便的访问互联网,而不用去记住能够被机 ...
- java面试题系列12
1.面向对象的特征有哪些方面 a.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节.抽象 ...