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的执行时间较长, ...
随机推荐
- CenterOS下从零起步简单部署RockMongo
使用Mongodb,对于调试Query,查看Collection等状态,有Rockmongo是非常方便的. 研究了下Rockmongo的部署,主要是依赖PHP环境的web服务器,当前有两种服务器,一种 ...
- 【异常记录(九)】 System.Threading.ThreadAbortException: 正在中止线程
报错如下: System.Threading.ThreadAbortException: Thread was being aborted. at System.Threading.Thread.Ab ...
- NYOJ 116 士兵杀敌(二)(二叉索引树)
http://acm.nyist.net/JudgeOnline/problem.php?pid=116 题意: 南将军手下有N个士兵,分别编号1到N,这些士兵的杀敌数都是已知的. 小工是南将军手下的 ...
- 在SSM框架中,multfile转file
import org.apache.commons.fileupload.disk.DiskFileItem; import org.springframework.web.multipart.Mul ...
- C#修饰符说明
方法不加访问修饰符默认的是 private 类不加访问修饰答默认的是 internal //////////////////////////////////////////////////////// ...
- TCGA系列--LncMAP
LncMAP:http://www.bio-bigdata.com/LncMAP/index.jsp
- 精通移动app测试实战
- java23种设计模式之一: 策略模式
由于最近在研究学习设计模式,我会用自己的理解方式来表述对设计模式的学习和认识,通过最常用.好记的案例来记住和使用设计模式,希望对设计代码方面有所提高和改进. 一.应用背景 在软件开发中常常遇到 ...
- 团队作业7—团队项目设计完善&编码测试
一.根据OOD详细设计工作要点,修改完善团队项目系统设计说明书和详细设计说明. <软件设计方案说明书>Github仓库地址:https://github.com/RNTF6/web 完善内 ...
- java中的值传递和引用传递用法详解
值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参 数的值. 引用传递:也称为传地址.方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对 ...