--- ibx/branches/udr/client/FBSQLData.pas 2022/01/10 10:13:17 380 +++ ibx/branches/udr/client/FBSQLData.pas 2022/01/15 00:06:22 381 @@ -1655,7 +1655,7 @@ var aValue: Int64; begin case SQLType of SQL_TEXT, SQL_VARYING: - Result := NewNumeric(GetAsString); + Result := StrToNumeric(GetAsString); SQL_SHORT: Result := NumericFromRawValues(PShort(SQLData)^, Scale); @@ -1670,7 +1670,7 @@ begin SQL_DEC34, SQL_DEC_FIXED, SQL_INT128: - Result := NewNumeric(GetAsBCD); + Result := BCDToNumeric(GetAsBCD); else IBError(ibxeInvalidDataConversion, [nil]); @@ -1816,7 +1816,7 @@ begin AsDouble := Value else if not CanChangeMetaData and ((SQLType <> SQL_INT64) or (Scale <> -4)) then - SetAsNumeric(NewNumeric(Value)) + SetAsNumeric(CurrToNumeric(Value)) else begin Changing; @@ -1834,7 +1834,7 @@ procedure TSQLDataItem.SetAsInt64(Value: begin CheckActive; if not CanChangeMetaData and ((SQLType <> SQL_INT64) or (Scale <> 0)) then - SetAsNumeric(NewNumeric(Value)) + SetAsNumeric(IntToNumeric(Value)) else begin Changing; @@ -1981,36 +1981,46 @@ end; procedure TSQLDataItem.SetAsDouble(Value: Double); begin CheckActive; - if IsNullable then - IsNull := False; + if not CanChangeMetaData and (SQLType <> SQL_DOUBLE) then + SetAsNumeric(DoubleToNumeric(Value)) + else + begin + if IsNullable then + IsNull := False; - Changing; - SQLType := SQL_DOUBLE; - DataLength := SizeOf(Double); - Scale := 0; - PDouble(SQLData)^ := Value; - Changed; + Changing; + SQLType := SQL_DOUBLE; + DataLength := SizeOf(Double); + Scale := 0; + PDouble(SQLData)^ := Value; + Changed; + end; end; procedure TSQLDataItem.SetAsFloat(Value: Float); begin CheckActive; - if IsNullable then - IsNull := False; + if not CanChangeMetaData and (SQLType <> SQL_FLOAT) then + SetAsNumeric(DoubleToNumeric(Value)) + else + begin + if IsNullable then + IsNull := False; - Changing; - SQLType := SQL_FLOAT; - DataLength := SizeOf(Float); - Scale := 0; - PSingle(SQLData)^ := Value; - Changed; + Changing; + SQLType := SQL_FLOAT; + DataLength := SizeOf(Float); + Scale := 0; + PSingle(SQLData)^ := Value; + Changed; + end; end; procedure TSQLDataItem.SetAsLong(Value: Long); begin CheckActive; if not CanChangeMetaData and ((SQLType <> SQL_LONG) or (Scale <> 0)) then - SetAsNumeric(NewNumeric(Value)) + SetAsNumeric(IntToNumeric(Value)) else begin if IsNullable then @@ -2058,7 +2068,7 @@ procedure TSQLDataItem.SetAsShort(Value: begin CheckActive; if not CanChangeMetaData and ((SQLType <> SQL_SHORT) or (Scale <> 0)) then - SetAsNumeric(NewNumeric(Value)) + SetAsNumeric(IntToNumeric(Value)) else begin Changing; @@ -2089,13 +2099,13 @@ begin else case VarType(Value) of varEmpty, varNull: IsNull := True; - varSmallint, varInteger, varByte, + varSmallint, varInteger, varByte, varLongWord, varWord, varShortInt, varInt64: - SetAsNumeric(NewNumeric(Int64(Value))); + SetAsNumeric(IntToNumeric(Int64(Value))); varSingle, varDouble: AsDouble := Value; varCurrency: - SetAsNumeric(NewNumeric(Currency(Value))); + SetAsNumeric(CurrToNumeric(Currency(Value))); varBoolean: AsBoolean := Value; varDate: @@ -2132,11 +2142,11 @@ begin with FFirebirdClientAPI do case GetSQLType of SQL_LONG: - PLong(SQLData)^ := SafeInteger(Value.clone(Scale).getRawValue); + PLong(SQLData)^ := SafeInteger(Value.AdjustScaleTo(Scale).getRawValue); SQL_SHORT: - PShort(SQLData)^ := SafeSmallInt(Value.clone(Scale).getRawValue); + PShort(SQLData)^ := SafeSmallInt(Value.AdjustScaleTo(Scale).getRawValue); SQL_INT64: - PInt64(SQLData)^ := Value.clone(Scale).getRawValue; + PInt64(SQLData)^ := Value.AdjustScaleTo(Scale).getRawValue; SQL_TEXT, SQL_VARYING: SetAsString(Value.getAsString); SQL_D_FLOAT, @@ -2165,7 +2175,7 @@ begin if not CanChangeMetaData then begin - SetAsNumeric(NewNumeric(aValue)); + SetAsNumeric(BCDToNumeric(aValue)); Exit; end; @@ -2500,7 +2510,7 @@ begin SQL_DEC34, SQL_INT128: if TryStrToBCD(Value,BCDValue) then - SetAsNumeric(NewNumeric(BCDValue)) + SetAsNumeric(BCDToNumeric(BCDValue)) else DoSetString;