2
0
Эх сурвалжийг харах

* Implemented DataConvert, bug #8204

git-svn-id: trunk@6354 -
joost 18 жил өмнө
parent
commit
370f7737b6
2 өөрчлөгдсөн 38 нэмэгдсэн , 10 устгасан
  1. 37 10
      fcl/db/dataset.inc
  2. 1 0
      fcl/db/db.pp

+ 37 - 10
fcl/db/dataset.inc

@@ -497,26 +497,53 @@ begin
   Result := False;
   Result := False;
 end;
 end;
 
 
+procedure TDataSet.DataConvert(aField: TField; aSource, aDest: Pointer;
+  aToNative: Boolean);
+  
+var
+  DT : TFieldType;
+  
+begin
+  DT := aField.DataType;
+  case DT of
+    ftDate, ftTime, ftDateTime: TDateTime(aDest^) := DateTimeRecToDateTime(DT, TDateTimeRec(aSource^));
+    ftTimeStamp               : TTimeStamp(aDest^) := TTimeStamp(aSource^);
+//    ftBCD                     : ;
+//    ftFMTBCD                  : ;
+//    ftBytes                   : ;
+//    ftVarBytes                : ;
+//    ftWideString              : ;
+
+  end;
+end;
+
 function TDataSet.GetFieldData(Field: TField; Buffer: Pointer;
 function TDataSet.GetFieldData(Field: TField; Buffer: Pointer;
   NativeFormat: Boolean): Boolean;
   NativeFormat: Boolean): Boolean;
 
 
 Var
 Var
-  DT : TFieldType;
-  DTRBuffer : TDateTimeRec;
+  AStatBuffer : Array[0..dsMaxStringSize] of Char;
+  ADynBuffer : pchar;
+
 begin
 begin
   If NativeFormat then
   If NativeFormat then
     Result:=GetFieldData(Field, Buffer)
     Result:=GetFieldData(Field, Buffer)
   else
   else
     begin
     begin
-    DT := Field.DataType;
-    case DT of
-      ftDate, ftTime, ftDateTime: begin
-                                  Result := GetfieldData(Field, @DTRBuffer);
-                                  TDateTime(buffer^) := DateTimeRecToDateTime(DT, DTRBuffer);
-                                  end
+    if Field.DataSize <= dsMaxStringSize then
+      begin
+      Result := GetfieldData(Field, @AStatBuffer);
+      if Result then DataConvert(Field,@AStatBuffer,Buffer,False);
+      end
     else
     else
-      Result:=GetFieldData(Field, Buffer)
-    end;
+      begin
+      GetMem(ADynBuffer,Field.DataSize);
+      try
+        Result := GetfieldData(Field, ADynBuffer);
+        if Result then DataConvert(Field,ADynBuffer,Buffer,False);
+      finally
+        FreeMem(ADynBuffer);
+        end;
+      end;
     end;
     end;
 end;
 end;
 
 

+ 1 - 0
fcl/db/db.pp

@@ -1150,6 +1150,7 @@ type
     function CompareBookmarks(Bookmark1, Bookmark2: TBookmark): Longint; virtual;
     function CompareBookmarks(Bookmark1, Bookmark2: TBookmark): Longint; virtual;
     function CreateBlobStream(Field: TField; Mode: TBlobStreamMode): TStream; virtual;
     function CreateBlobStream(Field: TField; Mode: TBlobStreamMode): TStream; virtual;
     procedure CursorPosChanged;
     procedure CursorPosChanged;
+    procedure DataConvert(aField: TField; aSource, aDest: Pointer; aToNative: Boolean); virtual;
     procedure Delete;
     procedure Delete;
     procedure DisableControls;
     procedure DisableControls;
     procedure Edit;
     procedure Edit;