对于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;