关于TBlobField的更新问题-通过传递Delta到中间层(150分)

  • 主题发起人 主题发起人 chimney
  • 开始时间 开始时间
C

chimney

Unregistered / Unconfirmed
GUEST, unregistred user!
更新语句格式:Update Table Set C1 =:C1,C2 =:C2,C3 =:C3 Where C1 =:KEY_C1,其中C1是关键字段。中间层调用DSP的ApplyUpdates(Delta,-1,ErrorCount)函数进行更新,DSP的
OnBeforeUpdateRecord事件代码如下:
Case UpdateKind of
ukModify://adoqUpdate是DSP绑定的数据集
adoqUpdate.SQL.Text:=ModifySQLText;//更新语句
ukInsert:
adoqUpdate.SQL.Text:=InsertSQLText;//插入语句
ukDelete:
adoqUpdate.SQL.Text:=DeleteSQLText;//删除语句
end;
for Index:=0 to adoqUpdate.Parameters.Count -1do
begin
Params:=adoqUpdate.Parameters.Items[Index];
PName:=Params.Name;
Key:=CompareText(Copy(PName,1,4),'KEY_') = 0;//判断是否是关键字段
if Key then
System.Delete(PName,1,4);
Field:=DeltaDS.FindField(PName);
Params.DataType:=Field.DataType;
if Not Assigned(Field) then
begin
Continue;
Exit;
end;
if Key then
Params.Value:=Field.OldValue
else
begin
PValue:=Field.NewValue;
if VarIsEmpty(PValue) then
PValue:=Field.OldValue;
if Field.DataType = ftBlob then
//更新TblobField
begin
AMemoryStream:=TMemoryStream.Create;
TBlobField(Field).SaveToStream(AMemoryStream);
AMemoryStream.Position:=0;
Params.LoadFromStream(AMemoryStream,ftGraphic);
AMemoryStream.Free;
end
else
begin
Params.Value:=PValue;
end;
end;
end;
Try
adoqUpdate.ExecSQL;
Finally
Applied:=True;
end;
问题:插入、删除记录都正常;当更新记录时,如果客户端更改过Blob字段,也正常,如果只更改过其他字段,如C2是BLOB字段,当客户端只更改C1,而C2未更改,系统正常更新操作,不会报错。但C2对应数据库里内容会被清空,初步判断TBlobField(Field).SaveToStream读取的应该是Field的NewValue,而C2未更改,所以NewValue为空,造成了清空了数据库里的内容。
怎么解决这个问题或者有更好的办法进行Blob字段更新。
 
var
v:Vaeiant
if VarisNull(cds.newValue) then
v:=cds.bolff.oldValue
else
v:=cds.bolbf.newvalue;
 
to lmxcyl:
var
v:Vaeiant
if VarisNull(cds.newValue) then
v:=cds.bolff.oldValue
else
v:=cds.bolbf.newvalue;
你的意思是然后把v转换成Stream存到Params中?直接赋值肯定是不行的,虽然不报错,但是保存的数据是坏的,读不出来的。
 
后退
顶部