📄 ibsql.pas
字号:
else
if Scale < 0 then
begin
for i := -1 downto Scale do
Scaling := Scaling * 10;
result := Val / Scaling;
end
else
result := Val;
end;
function TIBXSQLVAR.AdjustScaleToInt64(Value: Int64; Scale: Integer): Int64;
var
Scaling : Int64;
i: Integer;
Val: Int64;
begin
Scaling := 1; Val := Value;
if Scale > 0 then begin
for i := 1 to Scale do Scaling := Scaling * 10;
result := Val * Scaling;
end else if Scale < 0 then begin
for i := -1 downto Scale do Scaling := Scaling * 10;
result := Val div Scaling;
end else
result := Val;
end;
function TIBXSQLVAR.AdjustScaleToCurrency(Value: Int64; Scale: Integer): Currency;
var
Scaling : Int64;
i : Integer;
FractionText, PadText, CurrText: string;
begin
Result := 0;
Scaling := 1;
if Scale > 0 then
begin
for i := 1 to Scale do
Scaling := Scaling * 10;
result := Value * Scaling;
end
else
if Scale < 0 then
begin
for i := -1 downto Scale do
Scaling := Scaling * 10;
FractionText := IntToStr(abs(Value mod Scaling));
for i := Length(FractionText) to -Scale -1 do
PadText := '0' + PadText;
if Value < 0 then
CurrText := '-' + IntToStr(Abs(Value div Scaling)) + DecimalSeparator + PadText + FractionText
else
CurrText := IntToStr(Abs(Value div Scaling)) + DecimalSeparator + PadText + FractionText;
try
result := StrToCurr(CurrText);
except
on E: Exception do
IBError(ibxeInvalidDataConversion, [nil]);
end;
end
else
result := Value;
end;
function TIBXSQLVAR.GetAsCurrency: Currency;
begin
result := 0;
if FSQL.Database.SQLDialect < 3 then
result := GetAsDouble
else begin
if not IsNull then
case FXSQLVAR^.sqltype and (not 1) of
SQL_TEXT, SQL_VARYING: begin
try
result := StrtoCurr(AsString);
except
on E: Exception do IBError(ibxeInvalidDataConversion, [nil]);
end;
end;
SQL_SHORT:
result := AdjustScaleToCurrency(Int64(PShort(FXSQLVAR^.sqldata)^),
FXSQLVAR^.sqlscale);
SQL_LONG:
result := AdjustScaleToCurrency(Int64(PLong(FXSQLVAR^.sqldata)^),
FXSQLVAR^.sqlscale);
SQL_INT64:
result := AdjustScaleToCurrency(PInt64(FXSQLVAR^.sqldata)^,
FXSQLVAR^.sqlscale);
SQL_DOUBLE, SQL_FLOAT, SQL_D_FLOAT:
result := Trunc(AsDouble);
else
IBError(ibxeInvalidDataConversion, [nil]);
end;
end;
end;
function TIBXSQLVAR.GetAsInt64: Int64;
begin
result := 0;
if not IsNull then
case FXSQLVAR^.sqltype and (not 1) of
SQL_TEXT, SQL_VARYING: begin
try
result := StrToInt64(AsString);
except
on E: Exception do IBError(ibxeInvalidDataConversion, [nil]);
end;
end;
SQL_SHORT:
result := AdjustScaleToInt64(Int64(PShort(FXSQLVAR^.sqldata)^),
FXSQLVAR^.sqlscale);
SQL_LONG:
result := AdjustScaleToInt64(Int64(PLong(FXSQLVAR^.sqldata)^),
FXSQLVAR^.sqlscale);
SQL_INT64:
result := AdjustScaleToInt64(PInt64(FXSQLVAR^.sqldata)^,
FXSQLVAR^.sqlscale);
SQL_DOUBLE, SQL_FLOAT, SQL_D_FLOAT:
result := Trunc(AsDouble);
else
IBError(ibxeInvalidDataConversion, [nil]);
end;
end;
function TIBXSQLVAR.GetAsDateTime: TDateTime;
var
tm_date: TCTimeStructure;
begin
result := 0;
if not IsNull then
case FXSQLVAR^.sqltype and (not 1) of
SQL_TEXT, SQL_VARYING: begin
try
result := StrToDate(AsString);
except
on E: EConvertError do IBError(ibxeInvalidDataConversion, [nil]);
end;
end;
SQL_TYPE_DATE: begin
isc_decode_sql_date(PISC_DATE(FXSQLVAR^.sqldata), @tm_date);
try
result := EncodeDate(Word(tm_date.tm_year + 1900), Word(tm_date.tm_mon + 1),
Word(tm_date.tm_mday));
except
on E: EConvertError do begin
IBError(ibxeInvalidDataConversion, [nil]);
end;
end;
end;
SQL_TYPE_TIME: begin
isc_decode_sql_time(PISC_TIME(FXSQLVAR^.sqldata), @tm_date);
try
result := EncodeTime(Word(tm_date.tm_hour), Word(tm_date.tm_min),
Word(tm_date.tm_sec), 0)
except
on E: EConvertError do begin
IBError(ibxeInvalidDataConversion, [nil]);
end;
end;
end;
SQL_TIMESTAMP: begin
isc_decode_date(PISC_QUAD(FXSQLVAR^.sqldata), @tm_date);
try
result := EncodeDate(Word(tm_date.tm_year + 1900), Word(tm_date.tm_mon + 1),
Word(tm_date.tm_mday));
if result >= 0 then
result := result + EncodeTime(Word(tm_date.tm_hour), Word(tm_date.tm_min),
Word(tm_date.tm_sec), 0)
else
result := result - EncodeTime(Word(tm_date.tm_hour), Word(tm_date.tm_min),
Word(tm_date.tm_sec), 0)
except
on E: EConvertError do begin
IBError(ibxeInvalidDataConversion, [nil]);
end;
end;
end;
else
IBError(ibxeInvalidDataConversion, [nil]);
end;
end;
function TIBXSQLVAR.GetAsDouble: Double;
begin
result := 0;
if not IsNull then begin
case FXSQLVAR^.sqltype and (not 1) of
SQL_TEXT, SQL_VARYING: begin
try
result := StrToFloat(AsString);
except
on E: Exception do IBError(ibxeInvalidDataConversion, [nil]);
end;
end;
SQL_SHORT:
result := AdjustScale(Int64(PShort(FXSQLVAR^.sqldata)^),
FXSQLVAR^.sqlscale);
SQL_LONG:
result := AdjustScale(Int64(PLong(FXSQLVAR^.sqldata)^),
FXSQLVAR^.sqlscale);
SQL_INT64:
result := AdjustScale(PInt64(FXSQLVAR^.sqldata)^, FXSQLVAR^.sqlscale);
SQL_FLOAT:
result := PFloat(FXSQLVAR^.sqldata)^;
SQL_DOUBLE, SQL_D_FLOAT:
result := PDouble(FXSQLVAR^.sqldata)^;
else
IBError(ibxeInvalidDataConversion, [nil]);
end;
if FXSQLVAR^.sqlscale <> 0 then
result :=
StrToFloat(FloatToStrF(result, fffixed, 15,
Abs(FXSQLVAR^.sqlscale) ));
end;
end;
function TIBXSQLVAR.GetAsFloat: Float;
begin
result := 0;
try
result := AsDouble;
except
on E: SysUtils.EOverflow do
IBError(ibxeInvalidDataConversion, [nil]);
end;
end;
function TIBXSQLVAR.GetAsLong: Long;
begin
result := 0;
if not IsNull then
case FXSQLVAR^.sqltype and (not 1) of
SQL_TEXT, SQL_VARYING: begin
try
result := StrToInt(AsString);
except
on E: Exception do IBError(ibxeInvalidDataConversion, [nil]);
end;
end;
SQL_SHORT:
result := Trunc(AdjustScale(Int64(PShort(FXSQLVAR^.sqldata)^),
FXSQLVAR^.sqlscale));
SQL_LONG:
result := Trunc(AdjustScale(Int64(PLong(FXSQLVAR^.sqldata)^),
FXSQLVAR^.sqlscale));
SQL_INT64:
result := Trunc(AdjustScale(PInt64(FXSQLVAR^.sqldata)^, FXSQLVAR^.sqlscale));
SQL_DOUBLE, SQL_FLOAT, SQL_D_FLOAT:
result := Trunc(AsDouble);
else
IBError(ibxeInvalidDataConversion, [nil]);
end;
end;
function TIBXSQLVAR.GetAsPointer: Pointer;
begin
if not IsNull then
result := FXSQLVAR^.sqldata
else
result := nil;
end;
function TIBXSQLVAR.GetAsQuad: TISC_QUAD;
begin
result.gds_quad_high := 0;
result.gds_quad_low := 0;
if not IsNull then
case FXSQLVAR^.sqltype and (not 1) of
SQL_BLOB, SQL_ARRAY, SQL_QUAD:
result := PISC_QUAD(FXSQLVAR^.sqldata)^;
else
IBError(ibxeInvalidDataConversion, [nil]);
end;
end;
function TIBXSQLVAR.GetAsShort: Short;
begin
result := 0;
try
result := AsLong;
except
on E: Exception do IBError(ibxeInvalidDataConversion, [nil]);
end;
end;
function TIBXSQLVAR.GetAsString: String;
var
sz: PChar;
str_len: Integer;
ss: TStringStream;
begin
result := '';
{ Check null, if so return a default string }
if not IsNull then
case FXSQLVar^.sqltype and (not 1) of
SQL_ARRAY:
result := '(Array)'; {do not localize}
SQL_BLOB: begin
ss := TStringStream.Create('');
try
SaveToStream(ss);
result := ss.DataString;
finally
ss.Free;
end;
end;
SQL_TEXT, SQL_VARYING: begin
sz := FXSQLVAR^.sqldata;
if (FXSQLVar^.sqltype and (not 1) = SQL_TEXT) then
str_len := FXSQLVar^.sqllen
else
begin
str_len := isc_vax_integer(FXSQLVar^.sqldata, 2);
Inc(sz, 2);
end;
SetString(result, sz, str_len);
end;
SQL_TYPE_DATE:
case FSQL.Database.SQLDialect of
1 : result := DateTimeToStr(AsDateTime);
3 : result := DateToStr(AsDateTime);
end;
SQL_TYPE_TIME :
result := TimeToStr(AsDateTime);
SQL_TIMESTAMP:
result := DateTimeToStr(AsDateTime);
SQL_SHORT, SQL_LONG:
if FXSQLVAR^.sqlscale = 0 then
result := IntToStr(AsLong)
else if FXSQLVAR^.sqlscale >= (-4) then
result := CurrToStr(AsCurrency)
else
result := FloatToStr(AsDouble);
SQL_INT64:
if FXSQLVAR^.sqlscale = 0 then
result := IntToStr(AsInt64)
else if FXSQLVAR^.sqlscale >= (-4) then
result := CurrToStr(AsCurrency)
else
result := FloatToStr(AsDouble);
SQL_DOUBLE, SQL_FLOAT, SQL_D_FLOAT:
result := FloatToStr(AsDouble);
else
IBError(ibxeInvalidDataConversion, [nil]);
end;
end;
function TIBXSQLVAR.GetAsVariant: Variant;
begin
if IsNull then
result := NULL
{ Check null, if so return a default string }
else case FXSQLVar^.sqltype and (not 1) of
SQL_ARRAY:
result := '(Array)'; {do not localize}
SQL_BLOB:
result := '(Blob)'; {do not localize}
SQL_TEXT, SQL_VARYING:
result := AsString;
SQL_TIMESTAMP, SQL_TYPE_DATE, SQL_TYPE_TIME:
result := AsDateTime;
SQL_SHORT, SQL_LONG:
if FXSQLVAR^.sqlscale = 0 then
result := AsLong
else if FXSQLVAR^.sqlscale >= (-4) then
result := AsCurrency
else
result := AsDouble;
SQL_INT64:
if FXSQLVAR^.sqlscale = 0 then
IBError(ibxeInvalidDataConversion, [nil])
else if FXSQLVAR^.sqlscale >= (-4) then
result := AsCurrency
else
result := AsDouble;
SQL_DOUBLE, SQL_FLOAT, SQL_D_FLOAT:
result := AsDouble;
else
IBError(ibxeInvalidDataConversion, [nil]);
end;
end;
function TIBXSQLVAR.GetAsXSQLVAR: PXSQLVAR;
begin
result := FXSQLVAR;
end;
function TIBXSQLVAR.GetIsNull: Boolean;
begin
result := IsNullable and (FXSQLVAR^.sqlind^ = -1);
end;
function TIBXSQLVAR.GetIsNullable: Boolean;
begin
result := (FXSQLVAR^.sqltype and 1 = 1);
end;
procedure TIBXSQLVAR.LoadFromFile(const FileName: String);
var
fs: TFileStream;
begin
fs := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
try
LoadFromStream(fs);
finally
fs.Free;
end;
end;
procedure TIBXSQLVAR.LoadFromStream(Stream: TStream);
var
bs: TIBBlobStream;
begin
bs := TIBBlobStream.Create;
try
bs.Mode := bmWrite;
bs.Database := FSQL.Database;
bs.Transaction := FSQL.Transaction;
Stream.Seek(0, soFromBeginning);
bs.LoadFromStream(Stream);
bs.Finalize;
AsQuad := bs.BlobID;
finally
bs.Free;
end;
end;
procedure TIBXSQLVAR.SaveToFile(const FileName: String);
var
fs: TFileStream;
begin
fs := TFileStream.Create(FileName, fmCreate or fmShareExclusive);
try
SaveToStream(fs);
finally
fs.Free;
end;
end;
procedure TIBXSQLVAR.SaveToStream(Stream: TStream);
var
bs: TIBBlobStream;
begin
bs := TIBBlobStream.Create;
try
bs.Mode := bmRead;
bs.Database := FSQL.Database;
bs.Transaction := FSQL.Transaction;
bs.BlobID := AsQuad;
bs.SaveToStream(Stream);
finally
bs.Free;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -