李维多层分布式系统篇中“第3章 开发高级的分布式多层应该用系统”书上的的例子bug修正 (300分)

  • 主题发起人 主题发起人 maming
  • 开始时间 开始时间
M

maming

Unregistered / Unconfirmed
GUEST, unregistred user!
李维多层分布式系统篇中“第3章 开发高级的分布式多层应该用系统”书上的的例子
显示出来的结果都是一样的(3-14页),取得的providerflags都一个样,
是我错了,还是他错了,真的搞不懂。
更有意思的是,我采用他书上(3-26页)的方法更新,结果主表修改数据时一定要修改备注,
否则就把备注清空了,现在我快要疯了,如果这是delphi的bug,那可就惨了,我在d6里
试了也是一样的。
各位要是有空帮忙试一下,我总不得要旨。高分奉上。
 
李维书上的错误怎么这么多!!!
 
李维的错。
 
李维没有错,如果你想看到的providerflags不一样,打开dspDemoServer,右击Query2,
选Fields Editor,在字段编辑器dspDemoServer.Query内选择你想修改的字段,比如Salary,
设置它的Providerflags与其他字段不同。这样你就可以看到不同的providerflags。
 
>>采用书上(3-26页)的方法更新,结果主表修改数据时一定要修改备注,
>>否则就把备注清空了,
这是个大问题,请各位帮忙。
 
李维诗歌骗子
书上的例子有好多错误
至少是笼统,如果怕人学会,你就不要出书!骗钱那!
我已把他的书全买下了。
现在知道错了
TMD
 
我想应该有一个标志可以显示,delta中的数据那些是改了的,那些是没有改变的,
因为bolb域要是没有改变的话,就没有提交,到了服务器上就变成了空,
所以李维的那个setparam过程就有bug了,没有提交的域bolb修改后就变成了空,
而实际上是有数据的,现在好惨,我想了几个办法还是没有用,那位好心人给点帮助吧/1
 
to:PS克
你写几本我读读。
 
李维的书其实是很不错的,其书中的例子大部分我都实现了
 
to:micro73:
你好,请问在用
clientdataset1.close;
clientdataset1.commandtext:=' ';
clientdataset1.open;
为什么总不能成功,而且提示为:commandtext changes are not allowed;
是怎么回事啊?还有请问用dcomconnection1.appserver.test('***','****');时
为什么总是提示:找不到成员啊?我在TYPE LIBERY中加了的set_test啊!
 
我也买了Lee Wei 的三本书,但现在正是期末考试,无暇顾及,
只得作罢, 待以后有时间向高手学习
 
to maming:
李维书上的例子确实有许多写的不明白的地方,但是只要仔细研究,还是很多收获的。
不象有的人把他说成骗子。依我个人估计,实现不了例子的人多数是对分布式系统还
不是很熟悉。
对于你的问题,你说的不太清楚,不知道关键出在什麽地方。其中的delta的数据结构
我看你一定搞错了。Delta的数据分几种update方式(Tdataset.updatestates):
1、修改:分两行记录,一行显示修改后的数据,另一行显示原始数据;
2、插入:显示插入的那一行的数据;
3、删除:显示删除的那一行的数据;
当Delta数据包发送的服务器时,由Tprovider进行解析,根据前面说的三种情况,
分别产生SQL语句,再传给数据库驱动程序,进行更新数据。
我建议你继续看下去,把李维书看完。估计再回头看,就明白了!
to 动画人生:
你把服务器上的Tdatasetprovider的allowcommandtext:=true,应该就能解决问题。
 
对于providerflags的说法,我想是我错了,因为那只是用来控制更新的,不能作
判断是否修改的标志.
我不想去说李维先生的错误,可以下这个过程,其中就存在很多的bug;
以前没有注意会出现bolb域在修改了其他的域之后会被清空。
procedure setparams(FUpdateSQL: TUpdateSQL;DeltaDS: TClientDataSet;
UpdateKind: TUpdateKind);
var
I: integer;
Old: Boolean;
Param: TParam;
Pname: string;
Field: TField;
Value: Variant;
oldValue: Variant;
curValue: Variant;
Buffer: Pointer;
begin
if not Assigned(FUpdateSQL.DataSet) then
exit;

{本人写的一个自动形成修改与增加时sql的过程,加入这里的话就
完全可以搞定了,正在进行中....}
with FUpdateSQL.Query[UpdateKind]do
begin
for I:=0 to Params.Count-1do
begin
Param := Params;
Pname := Param.Name;
Old := CompareText(copy(PName,1,4),'OLD_')=0;
if Old then
system.Delete(Pname,1,4);
Field := DeltaDS.FindField(Pname);
{请看下面这一句,如果这样跳过的话,到了updatesql.execsql时就会报没有域存在的错误。
也就是说,这里只对客户sql与服务器sql域完全相同时才无错,可如果完全相同,此处就完全
没有意义了。}
if not Assigned(Field) then
continue;
if Old then
param.AssignFieldValue(Field,Field.OldValue)
else
begin
// 修改数据时如果备注未改变则不赋值,否则会清空(bug)
Value := Field.NewValue;
if VarIsEmpty(Value) then
Value := Field.OldValue;
param.AssignFieldValue(Field,Value);
end;
end;
end;
end;

 
我的意见:
李维书中的例子都是有理论依据的,但是程序代码中总是有一些小BUG,所以完全照着做可能不行
改一改就好了
像我实现客户端维护数据集光标的例子李维的就不正确但是稍微想想修改一下就好了
 
to morboy:
“维护数据集光标....”
可不可以说说你的解决办法?
 
这两天我也被李维给害惨了,他的书写得挺热闹,但是我一步步按着他的做,结果却总是
有问题,把他的例子拷过来,更是问题一大堆,自己要调整个老半天,真是太不严谨了!
 
我觉得李维的书还不错,里面的例子我基本上都实现了,特别是那本多层分布式系统篇。
觉得他的书打基础真不错,但要实际应用,还要自己加料,例如多层分布式系统篇里面他多是用BED的,现在用ADO,差距还是有一点地。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部