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 ...
随机推荐
- 浅析Thinkphp框架中运用phprpc扩展模式
浅析Thinkphp框架中应用phprpc扩展模式 这次的项目舍弃了原来使用Axis2做web服务端的 方案,改用phprpc实现,其一是服务端的thinkphp已集成有该模式接口,其二是phprpc ...
- telnet登陆路由器。。。
登陆路由有两种方式.一种是console,还有一种是使用telnet,由于我电脑是win7,不支持console.也懒得装软件,就使用telnent为例. 一.开启telnetclient 对于XP. ...
- block 解析 - 内存
block结构体相应的也有一个成员引用,这样会增加对局部变量的 _para1引用,在Block销毁的时候引用就释放掉了 我们了解到了用__block修饰的变量,可以在block内部修改,__block ...
- java基于P2P的聊天和文件传输实例
用java的NIO技术编写的 1. 支持聊天功能 2. 拖拽文件能够实现文件传输功能.也能够是目录 3. 启动时能够选择server端或client端启动 4. 本人原创.学习NIO和java的网络通 ...
- python property装饰器
直接上代码: #!/usr/bin/python #encoding=utf-8 """ @property 可以将python定义的函数“当做”属性访问,从而提供更加友 ...
- ShineTime 是一个效果非常精致的缩略图相册
ShineTime 是一个效果非常精致的缩略图相册,鼠标悬停到缩略图的时候有很炫的闪光效果,基于 CSS3 实现,另外缩略图也会有立体移动的效果.特别适用于个人摄影作品,公司产品展示等用途,快来来围观 ...
- Android 开发笔记“调用.net webservice遇到的问题”
1.An exception occurred: org.ksoap2.SoapFault SoapFault - faultcode: 'soap:Server' faultstring: '服务器 ...
- 设计模式的PHP实现示例(转)
symfony2 很多设计模式思想,下面的资料会有点帮助:http://www.open-open.com/lib/view/open1414996676559.html 阅读目录 Creationa ...
- spss
编辑 SPSS(Statistical Product and Service Solutions),“统计产品与服务解决方案”软件.最初软件全称为“社会科学统计软件包” (SolutionsStat ...
- Android系统智能指针的设计思路(轻量级指针、强指针、弱指针)
本博客为原创,转载请注明出处,谢谢. 参考博文:Android系统的智能指针(轻量级指针.强指针和弱指针)的实现原理分析 C++中最容易出错的地方莫过于指针了,指针问题主要有两类,一是内存泄露,二是无 ...