--- ibx/trunk/runtime/IBCustomDataSet.pas 2018/01/18 14:37:32 105 +++ ibx/trunk/runtime/IBCustomDataSet.pas 2018/01/18 14:37:35 106 @@ -2074,7 +2074,8 @@ procedure TIBCustomDataSet.ColumnDataToB ColumnIndex, FieldIndex: integer; Buffer: PChar); var LocalData: PByte; - LocalDate, LocalDouble: Double; + LocalDate: TDateTime; + LocalDouble: Double; LocalInt: Integer; LocalBool: wordBool; LocalInt64: Int64; @@ -2089,21 +2090,14 @@ begin begin ColData := QryResults[ColumnIndex]; case fdDataType of {Get Formatted data for column types that need formatting} + SQL_TYPE_DATE, + SQL_TYPE_TIME, SQL_TIMESTAMP: begin - LocalDate := TimeStampToMSecs(DateTimeToTimeStamp(ColData.AsDateTime)); + {This is an IBX native format and not the TDataset approach. See also GetFieldData} + LocalDate := ColData.AsDateTime; LocalData := PByte(@LocalDate); end; - SQL_TYPE_DATE: - begin - LocalInt := DateTimeToTimeStamp(ColData.AsDateTime).Date; - LocalData := PByte(@LocalInt); - end; - SQL_TYPE_TIME: - begin - LocalInt := DateTimeToTimeStamp(ColData.AsDateTime).Time; - LocalData := PByte(@LocalInt); - end; SQL_SHORT, SQL_LONG: begin if (fdDataScale = 0) then @@ -2829,21 +2823,11 @@ begin end; SQL_BLOB, SQL_ARRAY, SQL_QUAD: Param.AsQuad := PISC_QUAD(data)^; - SQL_TYPE_DATE: - begin - ts.Date := PInt(data)^; - ts.Time := 0; - Param.AsDate := TimeStampToDateTime(ts); - end; - SQL_TYPE_TIME: - begin - ts.Date := 0; - ts.Time := PInt(data)^; - Param.AsTime := TimeStampToDateTime(ts); - end; + SQL_TYPE_DATE, + SQL_TYPE_TIME, SQL_TIMESTAMP: - Param.AsDateTime := - TimeStampToDateTime(MSecsToTimeStamp(trunc(PDouble(data)^))); + {This is an IBX native format and not the TDataset approach. See also SetFieldData} + Param.AsDateTime := PDateTime(data)^; SQL_BOOLEAN: Param.AsBoolean := PWordBool(data)^; end; @@ -4170,11 +4154,13 @@ begin for i := 0 to SQLParams.GetCount - 1 do begin cur_field := DataSource.DataSet.FindField(SQLParams[i].Name); - cur_param := SQLParams[i]; - if (cur_field <> nil) then begin + if (cur_field <> nil) then + begin + cur_param := SQLParams[i]; if (cur_field.IsNull) then cur_param.IsNull := True - else case cur_field.DataType of + else + case cur_field.DataType of ftString: cur_param.AsString := cur_field.AsString; ftBoolean: @@ -4184,7 +4170,7 @@ begin ftInteger: cur_param.AsLong := cur_field.AsInteger; ftLargeInt: - cur_param.AsInt64 := TLargeIntField(cur_field).AsLargeInt; + cur_param.AsInt64 := cur_field.AsLargeInt; ftFloat, ftCurrency: cur_param.AsDouble := cur_field.AsFloat; ftBCD: @@ -4938,7 +4924,8 @@ end; function TIBCustomDataSet.GetFieldData(Field: TField; Buffer: Pointer; NativeFormat: Boolean): Boolean; begin - if (Field.DataType = ftBCD) and not NativeFormat then + {These datatypes use IBX conventions and not TDataset conventions} + if (Field.DataType in [ftBCD,ftDateTime,ftDate,ftTime]) and not NativeFormat then Result := InternalGetFieldData(Field, Buffer) else Result := inherited GetFieldData(Field, Buffer, NativeFormat); @@ -4964,7 +4951,8 @@ end; procedure TIBCustomDataSet.SetFieldData(Field: TField; Buffer: Pointer; NativeFormat: Boolean); begin - if (not NativeFormat) and (Field.DataType = ftBCD) then + {These datatypes use IBX conventions and not TDataset conventions} + if (not NativeFormat) and (Field.DataType in [ftBCD,ftDateTime,ftDate,ftTime]) then InternalSetfieldData(Field, Buffer) else inherited SetFieldData(Field, buffer, NativeFormat);