KbmMW两种查询结果集通讯方式
KbmMW本身可以用QueryService的方式进行远程数据查询,但是SmpileService同样具有很强的扩展性可以实现数据查询,下面展示两种基于SmpileService的远程数据查询方法,其原理都是利用TkbmMWSimpleService实现流的传输。
直接上代码了:
一、利用KbmMemTable:
- 服务端:
|
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
|
unit unt_service_func;// =========================================================================// kbmMW - An advanced and extendable middleware framework.// by Components4Developers (http://www.components4developers.com)//// Service generated by kbmMW service wizard.//// INSTRUCTIONS FOR REGISTRATION/USAGE// -----------------------------------// Please update the uses clause of the datamodule/form the TkbmMWServer is placed on by adding // YourServiceUnitName to it. Eg.// // uses ...,kbmMWServer,YourServiceUnitName;// // Somewhere in your application, make sure to register the serviceclass to the TkbmMWServer instance. Eg.// // var// sd:TkbmMWCustomServiceDefinition;// ..// sd:=kbmMWServer1.RegisterService(yourserviceclassname,false);// // Set the last parameter to true if this is the default service.// {$I kbmMW.inc}interfaceuses SysUtils,{$ifdef LEVEL6} Variants,{$else} Forms,{$endif} Classes, kbmMWSecurity, kbmMWServer, kbmMWServiceUtils, kbmMWGlobal, kbmMWADOX,DB, ADODB,kbmMemTable, kbmMemBinaryStreamFormat;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 PerformUpdate(ClientIdent:TkbmMWClientIdentity; const Args:array of Variant):Variant; virtual; function PerformSelect(ClientIdent:TkbmMWClientIdentity; const Args:array of Variant):Variant; virtual; public { Public declarations }{$IFNDEF CPP}class{$ENDIF} function GetPrefServiceName:string; override;{$IFNDEF CPP}class{$ENDIF} function GetVersion:string; override;{$IFNDEF CPP}class{$ENDIF} function GetFlags:TkbmMWServiceFlags; override; end;implementationuses kbmMWExceptions, unt_main, unt_dm;{$R *.dfm}// Service definitions.//---------------------{$IFNDEF CPP}class{$ENDIF} function TkbmMWSimpleService1.GetPrefServiceName:string;begin Result:='demoservice';end;{$IFNDEF CPP}class{$ENDIF} function TkbmMWSimpleService1.GetVersion:string;begin Result:='1.0';end;{$IFNDEF CPP}class{$ENDIF} function TkbmMWSimpleService1.GetFlags:TkbmMWServiceFlags;begin Result:=[mwsfListed];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='UPDATE' then // 关联到PerformUpdate函数 Result:=PerformUpdate(ClientIdent,Args) else if AFunc='SELECT' then // 关联到PerformSelect 函数 Result:=PerformSelect(ClientIdent,Args) else Result:=inherited ProcessRequest(Func,ClientIdent,Args);end;function TkbmMWSimpleService1.PerformUpdate(ClientIdent:TkbmMWClientIdentity; const Args:array of Variant):Variant;var param: string; aQuery: TADOQuery; aconn: TkbmMWADOXConnection;begin Result := 0; param :=args[0]; //取出参数 aQuery := TADOQuery.Create(nil); //从数据库连接池中取出可用链接 aconn := TkbmMWADOXConnection(DataModule1.kbmMWADOXConnectionPool1.GetBestConnection(True,0,nil,10000)); if aconn = nil then begin kbmMWRaiseServerException('无可用的数据库连接'); Exit; end; aQuery.Connection := aconn.Database; aQuery.SQL.Text := 'update devinfo set dev_name=:param where id < 10'; aQuery.Parameters.ParamByName('param').Value := param; //传入参数 try try aQuery.ExecSQL; Result := aQuery.RowsAffected;//返回影响条数 except Result := -1; //错误时返回-1 end; finally aconn.UnlockConnection; aQuery.Free; end;end;function TkbmMWSimpleService1.PerformSelect(ClientIdent:TkbmMWClientIdentity; const Args:array of Variant):Variant;var param: string; aQuery: TADOQuery; aconn: TkbmMWADOXConnection; memTable: TkbmMemTable; //内存表类 aStreamFormat: TkbmBinaryStreamFormat; //流格式类begin Result := 0; param :=args[0]; //取出参数 aQuery := TADOQuery.Create(nil); //从数据库连接池中取出可用链接 aconn := TkbmMWADOXConnection(DataModule1.kbmMWADOXConnectionPool1.GetBestConnection(True,0,nil,10000)); if aconn = nil then begin kbmMWRaiseServerException('无可用的数据库连接'); Exit; end; aQuery.Connection := aconn.Database; aQuery.SQL.Text := 'select * from devinfo where dev_name=:param'; aQuery.Parameters.ParamByName('param').Value := param; //传入参数 //初始化内存表 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;//返回记录条数 //导入结果到流 memTable.LoadFromDataSet(aQuery,[mtcpoStructure,mtcpoProperties]); //格式化流 memTable.SaveToStreamViaFormat(ResultStream,aStreamFormat); except Result := -1; //错误时返回-1 end; finally aconn.UnlockConnection; aQuery.Free; memTable.Free; aStreamFormat.Free; end;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
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
|
unit unt_main;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs,kbmMemTable, kbmMemBinaryStreamFormat, kbmMWCustomTransport, kbmMWClient, kbmMWTCPIPIndyClientTransport, kbmMWClientDataset, kbmMWCustomConnectionPool, Grids, DBGrids, DB, StdCtrls;type Tmainform = class(TForm) Edit1: TEdit; Button1: TButton; Button2: TButton; Label1: TLabel; DataSource1: TDataSource; DBGrid1: TDBGrid; kbmMWSimpleClient1: TkbmMWSimpleClient; kbmMWTCPIPIndyClientTransport1: TkbmMWTCPIPIndyClientTransport; Edit2: TEdit; Label2: TLabel; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end;var mainform: Tmainform; aStreamFormat: TkbmBinaryStreamFormat; kbmMemTable: TkbmMemTable;implementation{$R *.dfm}procedure Tmainform.Button1Click(Sender: TObject);var args: array[0..1] of Variant; res: Integer;begin Edit2.Text := ''; args[0]:= Edit1.Text; //参数 res := kbmMWSimpleClient1.Request('demoservice','','SELECT',args); //发起请求 kbmMemTable.EmptyTable; //清空内存表 kbmMemTable.LoadFromStreamViaFormat(kbmMWSimpleClient1.ResultStream,aStreamFormat); //导入结果流 Edit2.Text := IntToStr(res);end;procedure Tmainform.Button2Click(Sender: TObject);var args: array[0..1] of Variant; res: Integer;begin Edit2.Text := ''; args[0]:= Edit1.Text; //参数 res := kbmMWSimpleClient1.Request('demoservice','','UPDATE',args); //发起请求 Edit2.Text := IntToStr(res); //返回值end;procedure Tmainform.FormCreate(Sender: TObject);begin aStreamFormat := TkbmBinaryStreamFormat.Create(nil); kbmMemTable := TkbmMemTable.Create(nil); kbmMemTable.DefaultFormat := aStreamFormat; DataSource1.DataSet := kbmMemTable; //设置dataset为内存表end;end. |
二、利用ClientDataSet:
- 服务端:
|
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
|
unit unt_service_func;// =========================================================================// kbmMW - An advanced and extendable middleware framework.// by Components4Developers (http://www.components4developers.com)//// Service generated by kbmMW service wizard.//// INSTRUCTIONS FOR REGISTRATION/USAGE// -----------------------------------// Please update the uses clause of the datamodule/form the TkbmMWServer is placed on by adding// YourServiceUnitName to it. Eg.//// uses ...,kbmMWServer,YourServiceUnitName;//// Somewhere in your application, make sure to register the serviceclass to the TkbmMWServer instance. Eg.//// var// sd:TkbmMWCustomServiceDefinition;// ..// sd:=kbmMWServer1.RegisterService(yourserviceclassname,false);//// Set the last parameter to true if this is the default service.//{$I kbmMW.inc}interfaceusesSysUtils,{$ifdef LEVEL6}Variants,{$else}Forms,{$endif}Classes,kbmMWSecurity,kbmMWServer,kbmMWServiceUtils,kbmMWGlobal,kbmMWADOX,DB, ADODB,MidasLib,DBClient,Provider;typeTkbmMWSimpleService1 = class(TkbmMWSimpleService)private{ Private declarations }protected{ Protected declarations }//新增以下函数function ProcessRequest(const Func:string; const ClientIdent:TkbmMWClientIdentity; const Args:array of Variant):Variant; override;function PerformUpdate(ClientIdent:TkbmMWClientIdentity; const Args:array of Variant):Variant; virtual;function PerformSelect(ClientIdent:TkbmMWClientIdentity; const Args:array of Variant):Variant; virtual;public{ Public declarations }{$IFNDEF CPP}class{$ENDIF} function GetPrefServiceName:string; override;{$IFNDEF CPP}class{$ENDIF} function GetVersion:string; override;{$IFNDEF CPP}class{$ENDIF} function GetFlags:TkbmMWServiceFlags; override;end;implementationuses kbmMWExceptions, unt_main, unt_dm;{$R *.dfm}// Service definitions.//---------------------{$IFNDEF CPP}class{$ENDIF} function TkbmMWSimpleService1.GetPrefServiceName:string;beginResult:='demoservice';end;{$IFNDEF CPP}class{$ENDIF} function TkbmMWSimpleService1.GetVersion:string;beginResult:='1.0';end;{$IFNDEF CPP}class{$ENDIF} function TkbmMWSimpleService1.GetFlags:TkbmMWServiceFlags;beginResult:=[mwsfListed];end;function TkbmMWSimpleService1.ProcessRequest(const Func:string; const ClientIdent:TkbmMWClientIdentity; const Args:array of Variant):Variant;varAFunc:string;beginAFunc:=UpperCase(Func);if AFunc='UPDATE' then // 关联到PerformUpdate函数Result:=PerformUpdate(ClientIdent,Args)elseif AFunc='SELECT' then // 关联到PerformSelect 函数Result:=PerformSelect(ClientIdent,Args)else Result:=inherited ProcessRequest(Func,ClientIdent,Args);end;function TkbmMWSimpleService1.PerformUpdate(ClientIdent:TkbmMWClientIdentity; const Args:array of Variant):Variant;varparam: string;aQuery: TADOQuery;aconn: TkbmMWADOXConnection;beginResult := 0;param :=args[0]; //取出参数aQuery := TADOQuery.Create(nil);//从数据库连接池中取出可用链接aconn := TkbmMWADOXConnection(DataModule1.kbmMWADOXConnectionPool1.GetBestConnection(True,0,nil,10000));if aconn = nil thenbeginkbmMWRaiseServerException('无可用的数据库连接');Exit;end;aQuery.Connection := aconn.Database;aQuery.SQL.Text := 'update devinfo set dev_name=:param where id < 10';aQuery.Parameters.ParamByName('param').Value := param; //传入参数trytryaQuery.ExecSQL;Result := aQuery.RowsAffected;//返回影响条数exceptResult := -1; //错误时返回-1end;finallyaconn.UnlockConnection;aQuery.Free;end;end;function TkbmMWSimpleService1.PerformSelect(ClientIdent:TkbmMWClientIdentity; const Args:array of Variant):Variant;varparam: string;aQuery: TADOQuery;aconn: TkbmMWADOXConnection;CDS: TClientDataSet;DSP: TDataSetProvider;MS: TMemoryStream;beginResult := 0;param :=args[0]; //取出参数aQuery := TADOQuery.Create(nil);//从数据库连接池中取出可用链接aconn := TkbmMWADOXConnection(DataModule1.kbmMWADOXConnectionPool1.GetBestConnection(True,0,nil,10000));if aconn = nil thenbeginkbmMWRaiseServerException('无可用的数据库连接');Exit;end;aQuery.Connection := aconn.Database;aQuery.SQL.Text := 'select * from devinfo where dev_name=:param';aQuery.Parameters.ParamByName('param').Value := param; //传入参数CDS := TClientDataSet.Create(nil);DSP := TDataSetProvider.Create(nil);MS := TMemoryStream.Create;trytryaQuery.Open;Result := aQuery.RecordCount;//返回记录条数DSP.DataSet := aQuery; //关联DataSetCDS.Data := DSP.Data; //传递给ClientDataSetCDS.SaveToStream(MS,dfBinary); //另存为内存流MS.Position := 0;ResultStream.LoadFromStream(MS); //导入到结果流exceptResult := -1; //错误时返回-1end;finallyaconn.UnlockConnection;aQuery.Free;CDS.Free;DSP.Free;MS.Free;end;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
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
|
unit unt_main;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs,kbmMWCustomTransport, kbmMWClient, kbmMWTCPIPIndyClientTransport,kbmMWClientDataset, kbmMWCustomConnectionPool, Grids, DBGrids, DB, StdCtrls,MidasLib,DBClient;typeTmainform = class(TForm)Edit1: TEdit;Button1: TButton;Button2: TButton;Label1: TLabel;DataSource1: TDataSource;DBGrid1: TDBGrid;kbmMWSimpleClient1: TkbmMWSimpleClient;kbmMWTCPIPIndyClientTransport1: TkbmMWTCPIPIndyClientTransport;Edit2: TEdit;Label2: TLabel;procedure Button1Click(Sender: TObject);procedure FormCreate(Sender: TObject);procedure Button2Click(Sender: TObject);procedure FormDestroy(Sender: TObject);private{ Private declarations }public{ Public declarations }end;varmainform: Tmainform;CDS: TClientDataSet;implementation{$R *.dfm}procedure Tmainform.Button1Click(Sender: TObject);varargs: array[0..1] of Variant;res: Integer;beginEdit2.Text := '';args[0]:= Edit1.Text; //参数res := kbmMWSimpleClient1.Request('demoservice','','SELECT',args); //发起请求CDS.LoadFromStream(kbmMWSimpleClient1.ResultStream);//从结果流中导入Edit2.Text := IntToStr(res);end;procedure Tmainform.Button2Click(Sender: TObject);varargs: array[0..1] of Variant;res: Integer;beginEdit2.Text := '';args[0]:= Edit1.Text; //参数res := kbmMWSimpleClient1.Request('demoservice','','UPDATE',args); //发起请求Edit2.Text := IntToStr(res);end;procedure Tmainform.FormCreate(Sender: TObject);beginCDS := TClientDataSet.Create(nil);DataSource1.DataSet := CDS; //设置datasetend;procedure Tmainform.FormDestroy(Sender: TObject);beginCDS.Free;end;end. |
转载请注明:梧桐树下 » KbmMW两种查询结果集通讯方式
http://www.pfeng.org/archives/671
KbmMW两种查询结果集通讯方式的更多相关文章
- easyui datagride 两种查询方式
easyui datagride 两种查询方式function doReseach() { //$('#tt').datagrid('load', { // FixedCompany: $('.c_s ...
- LINQ to Objects系列(2)两种查询语法介绍
LINQ为我们提供了两种查询语法,分别是查询表达式和查询方法语法.这篇文章分为以下几个方面进行总结. 1,一个包含两种查询语法的简单示例 2,查询表达式的结构 3,查询方法相关的运算符 一个包含两种查 ...
- reportConfig.xml两种数据源连接的配置方式
在reportConfig.xml配置文件中,我们提供了两种数据源连接的配置方式,分别如下: 1.jndi数据源配置(即:在dataSource中配置) 此配置适用于在j2ee的服务器中配置了j ...
- ZOJ-1610 线段树+两种查询方法(弥补我线段树区间填充的短板)
ZOJ-1610 线段树+两种查询方法(弥补我线段树区间填充的短板) 题意 题意:给一个n,代表n次操作,接下来每次操作表示把[l,r]区间的线段涂成k的颜色其中,l,r,k的范围都是0到8000 这 ...
- 流式思想概述和两种获取Stream流的方式
流式思想概述 整体来看,流式思想类似于工厂车间的生产流水线 当需要对多个元素进行操作(特别是多步操作)的时候,考虑到性能及便利性,我们应该首先拼好一个模型步骤方案,然后再按照方法去执行他 这张图中展示 ...
- 关于使用lazytag的线段树两种查询方式的比较研究
说到线段树,想来大家并不陌生——最基本的思路就是将其规划成块,然后只要每次修改时维护一下即可. 但是尤其是涉及到区间修改时,lazytag的使用往往能够对于程序的质量起到决定性作用(Ex:一般JSOI ...
- Android APP 两种用程序拨号的方式
想在APP中添加一个拨号功能该怎样做呢?Android提供了两种方式,一种是ACTION_CALL方式直接拨打,另一种是ACTION_DIAL方式打开系统的拨号界面. 下面我们来做个小例子 首先需要在 ...
- js两种定义函数、继承方式及区别
一:js两种定义函数的方式及区别 1:函数声明: function sayA() { alert("i am A"); } 2:函数表达式: var sayB = function ...
- WPF工作笔记:本地化支持、主进程通知、两种最常用异步编程方式
1.本地化支持 (1)重写控件默认的依赖属性LanguageProperty FrameworkElement.LanguageProperty.OverrideMetadata( typeof(Fr ...
随机推荐
- HTML5地理定位,百度地图API,知识点熟悉
推断浏览器的兼容问题: IE9+支持地理定位,FF Chrome新版支持地理定位 if (navigator.geolocation) { alert('支持地理定位'); } e ...
- 180行ruby代码搞定游戏2048
最今在玩2048这款小游戏,游戏逻辑简单,很适合我这样的对于游戏新入行的人来实现逻辑.于是选择了最拿手的ruby语言来实现这款小游戏的主要逻辑.还是挺简单的,加起来4小时左右搞定. 上代码: requ ...
- Node.js初学
Node.js 初学~ 其技术上最大的卖点是非阻塞的I/O和基于事件的异步处理机制. 后端没有什么深入研究,一直对其不是很了解. 透过一个例子看 非阻塞 与 通常的 阻塞 var text = rea ...
- 对Devexpress ASP.NET组件的一些看法
使用.net开发的应该都熟悉DevExpress这套组件,强大的功能,显著提高开发效率和提升用户体验. 不过好像大都用winform, 说起用asp.net组件来开发webform,很多人开口就说慢, ...
- JavaScriptCore.framework基本用法(二)
接着上节我们讲到的iOS调用js 下来我们使用js调用iOS js调用iOS分两种情况 一,js里面直接调用方法 二,js里面通过对象调用方法 首先我们看第一种,直接调用方法. 其中用到了iOS的bl ...
- js页面跳转 和 js打开新窗口 方法
js页面跳转 和 js打开新窗口 方法 第一种: 第二种: 第三种: 第四种: 第五种: 1.在原来的窗体中直接跳转用 window.location.href="你所要跳转的页面" ...
- JavaSE复习日记 : 算是个小前言吧
/* * Java也学了好久了,抽个时间整理了一下课堂笔记,也有些是我刚开始学会犯的一些错误.在这里浅谈一下JavaSE的基础内容,对我来说也是一种不错的复习方式. * * 那好,对于初学者来说,学习 ...
- 浅谈Servlet读取Html参数
1首先:webApp名称为cookieAndsession.html文件一般放在WebRoot文件夹下:/cookieAndsession/WebRoot/OrderForm.html,那么外界要访问 ...
- 关于playframework2.5
加入了很多新东西: 1.用akka streams 替换了大部分 iteratee-based async io,当然还有一些模块在用iteratees 2.java 的一些API 做了调整升级,以及 ...
- iptables 简单配置
通过命令 netstat -tnl 可以查看当前服务器打开了哪些端口 Ssh代码 netstat -tnl 查看防火墙设置 Ssh代码 iptables -L -n 开放 ...