Procházet zdrojové kódy

fcl-db: base: fix streaming of NULL values in XMLDatapacketReader (like in Delphi null values are skiped and are not saved into <ROW ... />)

git-svn-id: trunk@25409 -
lacak před 12 roky
rodič
revize
f11b8b5da4
1 změnil soubory, kde provedl 12 přidání a 9 odebrání
  1. 12 9
      packages/fcl-db/src/base/xmldatapacketreader.pp

+ 12 - 9
packages/fcl-db/src/base/xmldatapacketreader.pp

@@ -344,11 +344,11 @@ var FieldNr      : integer;
 begin
   with ADataset do for FieldNr:=0 to FieldDefs.Count-1 do
     begin
+    AField := Fields.FieldByNumber(FieldDefs[FieldNr].FieldNo);
     AFieldNode := FRecordNode.Attributes.GetNamedItem(FieldDefs[FieldNr].Name);
     if assigned(AFieldNode) then
       begin
        s := AFieldNode.NodeValue;
-       AField := Fields.FieldByNumber(FieldDefs[FieldNr].FieldNo);
        if (FieldDefs[FieldNr].DataType in [ftBlob, ftBytes, ftVarBytes]) and (s <> '') then
          s := DecodeStringBase64(s);
        if FieldDefs[FieldNr].DataType in [ftBlob, ftMemo, ftWideMemo] then
@@ -362,25 +362,28 @@ begin
       else
         AField.AsString := s;  // set it to the filterbuffer
       end
+    else
+      AField.SetData(nil);
     end;
 end;
 
 procedure TXMLDatapacketReader.StoreRecord(ADataset : TCustomBufDataset; ARowState : TRowState; AUpdOrder : integer = 0);
 var FieldNr : Integer;
     AFieldDef: TFieldDef;
-    s: string;
+    AField: TField;
     ARecordNode : TDOMElement;
 begin
   inc(FEntryNr);
   ARecordNode := XMLDocument.CreateElement('ROW');
-  for FieldNr := 0 to ADataset.FieldDefs.Count-1 do
+  with ADataset do for FieldNr := 0 to FieldDefs.Count-1 do
     begin
-    AFieldDef := ADataset.FieldDefs[FieldNr];
-    s := ADataset.Fields.FieldByNumber(AFieldDef.FieldNo).AsString;
-    if AFieldDef.DataType in [ftBlob, ftBytes, ftVarBytes] then
-      ARecordNode.SetAttribute(AFieldDef.Name, EncodeStringBase64(s))
-    else
-      ARecordNode.SetAttribute(AFieldDef.Name, s);
+    AFieldDef := FieldDefs[FieldNr];
+    AField := Fields.FieldByNumber(AFieldDef.FieldNo);
+    if not AField.IsNull then
+      if AFieldDef.DataType in [ftBlob, ftBytes, ftVarBytes] then
+        ARecordNode.SetAttribute(AFieldDef.Name, EncodeStringBase64(AField.AsString))
+      else
+        ARecordNode.SetAttribute(AFieldDef.Name, AField.AsString);
     end;
   if ARowState<>[] then
     begin