kbmMW 5.06.20试用笔记
1.kbmMWConfiguration自动备份配置文件的问题还没有修正。
下面是以前写过的内容,再一次在新闻组中提出这个问题:
kbmMW提供一个强大的配置信息管理对象,前期译过这个对象的介绍,在使用过程中,发现一个问题, 就是TkbmMWCustomConfigurationStorage.BackupMaxCount属性,当设置为0时,也会生成配置信息的备份文件,在最新的kbmMW 5.05.11版本中,每运行一次就生成一个配置文件,对此,修正了代码。
function kbmMWBackupFile,
....
if not FileExists(AFile) then
begin
Result:=AFile;
exit;
end;
if AMaxBackups<= then//判断AMaxbackups来决定是否生成备份文件:
begin
Result:=AFile;
exit;
end;
...
TSysConnectionParam = class//(TkbmMWConfigurableObject)
private
[kbmMW_Config('QueryServiceVersion',mwcdReadWrite)]
FQueryServiceVersion: string; [kbmMW_Config('QueryServiceName',mwcdReadWrite)]
FQueryServiceName: string; [kbmMW_Config('SessionName',mwcdReadWrite)]
FSessionName: string; [kbmMW_Config('FileServiceVersion',mwcdReadWrite)]
FFileServiceVersion: string; [kbmMW_Config('FileServiceName',mwcdReadWrite)]
FFileServiceName: string; public
property SessionName: string read FSessionName write FSessionName;
property QueryServiceName: string read FQueryServiceName write FQueryServiceName;
property QueryServiceVersion: string read FQueryServiceVersion write FQueryServiceVersion;
property FileServiceName:string read FFileServiceName write FFileServiceName;
property FileServiceVersion:string read FFileServiceVersion write FFileServiceVersion;
end;
这个TSysConnectionParam不从TkbmMWConfigurableObject继承,否则在android平台,出这个错误:Type (TSysConnectionParam@6260DC60) not registered as a known type.
说明TkbmMWConfigurableObject还是存在跨平台的问题。
既然不能从TkbmMWConfigurableObject继承,怎么实现一个自动读取与保存的配置对象呢,按Configuration REST easy with kbmMW #7。
为配置对象重载AfterConstruction与BeforeDestruction方法,实现自动保存与读取配置对象!
public
procedure AfterConstruction; override;
procedure BeforeDestruction; override;
{ TSysConnectionParam }
procedure TSysConnectionParam.AfterConstruction;
begin
inherited;
Config.ReadConfig(Self);
end;
procedure TSysConnectionParam.BeforeDestruction;
begin
Config.WriteConfig(Self);
inherited;
end;
现在,TSysConnectionParam的实例在建立与释放时,就能自动读取与保存参数,在Win32及Android下测试通过。
虽然TkbmMWConfigurableObject存在跨平台问题,但用上面方法来跳过,也是很好的方案,毕竟可以跨平台使用kbmMWConfiguration Frame!
procedure Tmainform.Button3Click(Sender: TObject);
begin kbmMWClientQuery1.Close;
kbmMWClientQuery2.Close; kbmMWClientQuery1.Open;
kbmMWClientQuery2.Open; kbmMWClientQuery1.AppendRecord([,'']);
kbmMWClientQuery1.AppendRecord([,'']);//t1表在数据库中主键重复错 kbmMWClientQuery2.AppendRecord([,'']);
kbmMWClientQuery2.AppendRecord([,'']);//t2表在数据库中主键重复错 kbmMWClientTransactionResolver1.Resolve([kbmMWClientQuery1,kbmMWClientQuery2]); end;
上面是测试代码,同时提交两个ClientQuery,每个表都有主键重复错误,造成提交失败的场景,这时候,客户端会产生异常:stream read error.
已经反馈到官方新闻组,但作者还让我写个demo,已经发给他,等处理。注意:这个问题在上一版本中就存在。
4.更新主键遇到的问题
这个是朋友在学习过程中遇到的,整理出测试项目,大体情况是这样的:
现在有表t1,FID是主键,假设有如下记录
FID FName
1 1
2 2
把第一条记录,FID改成2,提交,这时候主键重复,提交失败,这时候kbmMW的工作结果是对的
FID FName
1 1
2 2
现在把第一条记录的FID改成3,提交,这时候没有了主键重复问题,提交成功,这时候kbmMW的工作结果也是对的。
FID FName
3 1
2 2
现在把第一条记录的任务字段改变值,如FName改成2,提交失败,这个结果不对的。问题就在这里。
FID FName
3 2
2 2
这是按上面的测试方法写的代码,重显问题:
procedure Tmainform.Button4Click(Sender: TObject);
begin //这是一个bug Label1.Caption := ''; Memo1.Lines.Clear; // 删除所有记录
kbmMWClientQuery1.Close;
kbmMWClientQuery1.Open;
kbmMWClientQuery1.DeleteRecords;
kbmMWClientQuery1.Resolve; kbmMWClientQuery1.AppendRecord([, '']);
kbmMWClientQuery1.AppendRecord([, '']);
kbmMWClientQuery1.Resolve; // keyfield
//
// 1,2 2,2 3,2 3,1
// 2,2 2,2 2,2 2,2
// error ok error kbmMWClientQuery1.Close;
kbmMWClientQuery1.Open; kbmMWClientQuery1.First;
kbmMWClientQuery1.Edit;
kbmMWClientQuery1.FieldByName('fid').AsInteger := ;//主键重复
if not kbmMWClientTransactionResolver1.Resolve([kbmMWClientQuery1]) then
begin
DataSource3.DataSet := kbmMWClientQuery1.InfoTable;
Label1.Caption := kbmMWClientQuery1.InfoTable.FieldByName('kbmMW_ErrorMessage').AsString;
Memo1.Lines.Add('Step 1: Modify the primary key to generate an error, the submission failed,it''s right. '+kbmMWClientQuery1.InfoTable.FieldByName('kbmMW_ErrorMessage').AsString);
end; kbmMWClientQuery1.First;
kbmMWClientQuery1.Edit;
kbmMWClientQuery1.FieldByName('fid').AsInteger := ;//设置主键不重复 if not kbmMWClientTransactionResolver1.Resolve([kbmMWClientQuery1]) then
begin
DataSource3.DataSet := kbmMWClientQuery1.InfoTable;
Label1.Caption := kbmMWClientQuery1.InfoTable.FieldByName('kbmMW_ErrorMessage').AsString;
Memo1.Lines.Add('Step 2: Modify the primary key to resolve the error and submit successfully,it''s right. '+kbmMWClientQuery1.InfoTable.FieldByName('kbmMW_ErrorMessage').AsString);
end
else
begin
Memo1.Lines.Add('Step 2: step 2:Modify the primary key to resolve the error and submit successfully,it''s right.');
Label1.Caption := 'Resolve OK.';
end; kbmMWClientQuery1.First;
kbmMWClientQuery1.Edit;
kbmMWClientQuery1.FieldByName('fname').AsString := '';//无法修改这条记录了!这是bug. if not kbmMWClientTransactionResolver1.Resolve([kbmMWClientQuery1]) then
begin
DataSource3.DataSet := kbmMWClientQuery1.InfoTable;
Label1.Caption := kbmMWClientQuery1.InfoTable.FieldByName('kbmMW_ErrorMessage').AsString;
Memo1.Lines.Add('Step 3: Modify any field and cannot submit,it''s bug. '+kbmMWClientQuery1.InfoTable.FieldByName('kbmMW_ErrorMessage').AsString);
end
else
begin
Label1.Caption := 'Resolve OK.';
end; end;
5.洞主测试rest上传文件服务需要修正下面两个方法,并已经提交给作者,等待修正。
function TkbmMWHTTPMultiPart.GetAsBytes:TBytes;
var
p:PByte;
i:integer;
begin
SetLength(Result,FDataLength);
p:=PByte(FOwner.FStream.Memory);
inc(p,FDataOfs);
Move(p^,Result[],FDataLength); end; function TkbmMWHTTPMultiPart.GetAsString:string;
begin
Result:=TkbmMWPlatformMarshal.UTF8Decode(GetData,FDataLength);
end;
这是xalion写的上传文件服务的例子,必须学习了!
6.Scheduler存在的问题
WaitRuns: FileService的SameFile方法,不等取得本地文件的CheckSum,造成执行结果错误,这个问题在5.04.30解决过,不知为何又回来了,问题出在WaitRuns上,不等Scheduler执行。
SynchronizedAfterRun:利用Scheduler在线程中执行一个查询,然后在SynchronizedAfterRun使用查询回来的数据集,偶尔会出现找不到字段的问题。感觉与WaitRuns存在的问题有关系。
7.Q友冰雨反应Resolve问题
KbmMW V5.06.2,修改数据,kbmwclntrnsctnrslvrTR.Resolve([kbmwclntqryMain]),保存的时候,变成insert语句,导致主键重复。KbmMW V5.06.1 beta版本已经发现了这个问题,退回前一个正式版,目前正常了。
kbmMW 5.06.20试用笔记的更多相关文章
- kbmMW 5.07.00试用笔记
在kbmMW 5.06.20试用笔记中遇到的问题,在这个版本中,基本都解决了.但还是发现修正后存在的小问题及新问题: 1.Resolve返回值错误 当提交的ClientQuery是执行一条sql语句, ...
- kbmmw 5.06.20 发布
经过1个多月的测试,终于发布正式版. 5.06.20 July 11 2018 Important notes (changes that may break existing c ...
- 20.Python笔记之SqlAlchemy使用
Date:2016-03-27 Title:20.Python笔记之SqlAlchemy使用 Tags:python Category:Python 作者:刘耀 博客:www.liuyao.me 一. ...
- CentOS 7 mini 试用笔记
CentOS 7 mini 试用笔记 安装过程中,网卡是默认关闭的,要手动打开. 安装好以后,查看IP地址:# ip addr----------------------1: lo: 本地回环2: e ...
- android权限大全转http://www.cnblogs.com/classic/archive/2011/06/20/2085055.html
android权限大全转http://www.cnblogs.com/classic/archive/2011/06/20/2085055.html 访问登记属性 android.permission ...
- kbmMW 5.10.01试用报告
1.FileClient.SameFile 调用这个方法,当本地文件不存在时,会一直等待.跟踪代码,发现: function TkbmMWCustomFileClient.SameFileEx(Loc ...
- kbmmw 5.06.00 beta 发布
原生.高效.可扩展.跨平台通信库来了. we are happy to announce v5.06.00 BETA of our popular middleware for Delphi and ...
- iOS阶段学习第20天笔记(MRC内存管理)
iOS学习(OC语言)知识点整理 一.OC中的内存管理 1)概念:内存管理的对象为所有继承了NSObject的对象,对基本数据(如:int .float.double...)无效 OC中采用 ...
- uniGUI试用笔记(十三)调用WebService
今天尝试用uniGUI做Web服务器,调用应用服务器的WebService,遇到些问题记录下来备忘. 1.对WebService的调用同一般App程序,只是注意如果WebService的执行时间较长, ...
随机推荐
- 如何设置datatable的宽度
本文为博主原创,未经允许不得转载: datatable插件具有很好的自动适应性,在大多数情况下可以自适应,完美的展示列表内容. 实现其自适应的其特性为:"bAutoWidth": ...
- UVa 12325 宝箱
https://vjudge.net/problem/UVA-12325 题意:有一个体积为N的箱子和两种数量无限的宝物.宝物1的体积为S1,价值为V1‘宝物2的体积为S2,价值为V2.计算出最多能装 ...
- linux之cut用法--转载
cut是一个选取命令,就是将一段数据经过分析,取出我们想要的.一般来说,选取信息通常是针对“行”来进行分析的,并不是整篇信息分析的. (1)其语法格式为:cut [-bn] [file] 或 cut ...
- DBCC CHECKIDENT 和SET IDENTITY_INSERT table OFF
TRUNCATE TABLE [DBO].TRACKING_CODE_BASE_Jasmine DELETE FROM TRACKING_CODE_BASE_Jasmine 有同一张表,一次用trun ...
- C++ 多态性和虚函数
2017-06-27 19:17:52 C++面向对象编程的一个重要的特性就是多态性,而多态性的实现需要依赖虚函数的帮助. 一.多态的作用: 隐藏实现细节,使得代码能够模块化: 接口重用,实现“一个接 ...
- 测试工作中经常用到的一丢Linux命令
自己平时测试工作中经常要在Linux下搭建测试环境,有涉及到启动/终止服务器,修改tomcat配置文件,偶尔碰到端口被占用... 这时就不得不需要一些基本的Linux命令来处理遇到的这些问题 1.cd ...
- HTTP协议的请求与响应和CSS属性和定位
HTTP协议的请求与响应和CSS属性和定位 一.HTTP协议 1.1 HTTP定义 HTTP(Hypertext Transport Protocol),超文本传输协议. 一种详细规定了浏览器和web ...
- [.NET开发] C# BigInteger 处理超大整型数字
今天遇到一个要处理XSD中Integer的数值区间的计算的问题,Integer这个类型的值区间理论上是可没有边界的,假设目前的值是1.5E+10000, 这个数字已经达到double和Int64都无法 ...
- 《图解Http》8: 用户身份认证Cookie管理session; 9:HTTP的追加协议(websoket, webDAV)
基本认证,(安全等级低,多数网站不使用) Digest认证:(也不怎么用) SSL客户端认证:(凭借客户端证书认证,如网银登陆) 表单认证:用户名/密码.(常用) SSL客户端认证采用two-fact ...
- 3-4 8精彩算法集合。struct(C,ruby) Ruyb类对象和结构体, 3-5
在本章我遇到了c语言的struct数据,即自定义的数据结构.比如: struct edge { int u; int v; int w; }; 题目给了一组数据,用edge储存.需要按照w大小排序.我 ...