📄 ibsql.pas
字号:
end;
end;
function TIBXSQLVAR.GetSize: Integer;
begin
result := FXSQLVAR^.sqllen;
end;
function TIBXSQLVAR.GetSQLType: Integer;
begin
result := FXSQLVAR^.sqltype and (not 1);
end;
procedure TIBXSQLVAR.SetAsCurrency(Value: Currency);
var
xvar: TIBXSQLVAR;
i: Integer;
begin
if FSQL.Database.SQLDialect < 3 then
AsDouble := Value
else
begin
if IsNullable then
IsNull := False;
for i := 0 to FParent.FCount - 1 do
if FParent.FNames[i] = FName then
begin
xvar := FParent[i];
xvar.FXSQLVAR^.sqltype := SQL_INT64 or (xvar.FXSQLVAR^.sqltype and 1);
xvar.FXSQLVAR^.sqlscale := -4;
xvar.FXSQLVAR^.sqllen := SizeOf(Int64);
IBAlloc(xvar.FXSQLVAR^.sqldata, 0, xvar.FXSQLVAR^.sqllen);
PCurrency(xvar.FXSQLVAR^.sqldata)^ := Value;
xvar.FModified := True;
end;
end;
end;
procedure TIBXSQLVAR.SetAsInt64(Value: Int64);
var
i: Integer;
xvar: TIBXSQLVAR;
begin
if IsNullable then
IsNull := False;
for i := 0 to FParent.FCount - 1 do
if FParent.FNames[i] = FName then
begin
xvar := FParent[i];
xvar.FXSQLVAR^.sqltype := SQL_INT64 or (xvar.FXSQLVAR^.sqltype and 1);
xvar.FXSQLVAR^.sqlscale := 0;
xvar.FXSQLVAR^.sqllen := SizeOf(Int64);
IBAlloc(xvar.FXSQLVAR^.sqldata, 0, xvar.FXSQLVAR^.sqllen);
PInt64(xvar.FXSQLVAR^.sqldata)^ := Value;
xvar.FModified := True;
end;
end;
procedure TIBXSQLVAR.SetAsDate(Value: TDateTime);
var
i: Integer;
tm_date: TCTimeStructure;
Yr, Mn, Dy: Word;
xvar: TIBXSQLVAR;
begin
if FSQL.Database.SQLDialect < 3 then
begin
AsDateTime := Value;
exit;
end;
if IsNullable then
IsNull := False;
for i := 0 to FParent.FCount - 1 do
if FParent.FNames[i] = FName then
begin
xvar := FParent[i];
xvar.FXSQLVAR^.sqltype := SQL_TYPE_DATE or (xvar.FXSQLVAR^.sqltype and 1);
DecodeDate(Value, Yr, Mn, Dy);
with tm_date do begin
tm_sec := 0;
tm_min := 0;
tm_hour := 0;
tm_mday := Dy;
tm_mon := Mn - 1;
tm_year := Yr - 1900;
end;
xvar.FXSQLVAR^.sqllen := SizeOf(ISC_DATE);
IBAlloc(xvar.FXSQLVAR^.sqldata, 0, xvar.FXSQLVAR^.sqllen);
isc_encode_sql_date(@tm_date, PISC_DATE(xvar.FXSQLVAR^.sqldata));
xvar.FModified := True;
end;
end;
procedure TIBXSQLVAR.SetAsTime(Value: TDateTime);
var
i: Integer;
tm_date: TCTimeStructure;
Hr, Mt, S, Ms: Word;
xvar: TIBXSQLVAR;
begin
if FSQL.Database.SQLDialect < 3 then
begin
AsDateTime := Value;
exit;
end;
if IsNullable then
IsNull := False;
for i := 0 to FParent.FCount - 1 do
if FParent.FNames[i] = FName then
begin
xvar := FParent[i];
xvar.FXSQLVAR^.sqltype := SQL_TYPE_TIME or (xvar.FXSQLVAR^.sqltype and 1);
DecodeTime(Value, Hr, Mt, S, Ms);
with tm_date do begin
tm_sec := S;
tm_min := Mt;
tm_hour := Hr;
tm_mday := 0;
tm_mon := 0;
tm_year := 0;
end;
xvar.FXSQLVAR^.sqllen := SizeOf(ISC_TIME);
IBAlloc(xvar.FXSQLVAR^.sqldata, 0, xvar.FXSQLVAR^.sqllen);
isc_encode_sql_time(@tm_date, PISC_TIME(xvar.FXSQLVAR^.sqldata));
xvar.FModified := True;
end;
end;
procedure TIBXSQLVAR.SetAsDateTime(Value: TDateTime);
var
i: Integer;
tm_date: TCTimeStructure;
Yr, Mn, Dy, Hr, Mt, S, Ms: Word;
xvar: TIBXSQLVAR;
begin
if IsNullable then
IsNull := False;
for i := 0 to FParent.FCount - 1 do
if FParent.FNames[i] = FName then
begin
xvar := FParent[i];
xvar.FXSQLVAR^.sqltype := SQL_TIMESTAMP or (xvar.FXSQLVAR^.sqltype and 1);
DecodeDate(Value, Yr, Mn, Dy);
DecodeTime(Value, Hr, Mt, S, Ms);
with tm_date do begin
tm_sec := S;
tm_min := Mt;
tm_hour := Hr;
tm_mday := Dy;
tm_mon := Mn - 1;
tm_year := Yr - 1900;
end;
xvar.FXSQLVAR^.sqllen := SizeOf(TISC_QUAD);
IBAlloc(xvar.FXSQLVAR^.sqldata, 0, xvar.FXSQLVAR^.sqllen);
isc_encode_date(@tm_date, PISC_QUAD(xvar.FXSQLVAR^.sqldata));
xvar.FModified := True;
end;
end;
procedure TIBXSQLVAR.SetAsDouble(Value: Double);
var
i: Integer;
xvar: TIBXSQLVAR;
begin
if IsNullable then
IsNull := False;
for i := 0 to FParent.FCount - 1 do
if FParent.FNames[i] = FName then
begin
xvar := FParent[i];
xvar.FXSQLVAR^.sqltype := SQL_DOUBLE or (xvar.FXSQLVAR^.sqltype and 1);
xvar.FXSQLVAR^.sqllen := SizeOf(Double);
xvar.FXSQLVAR^.sqlscale := 0;
IBAlloc(xvar.FXSQLVAR^.sqldata, 0, xvar.FXSQLVAR^.sqllen);
PDouble(xvar.FXSQLVAR^.sqldata)^ := Value;
xvar.FModified := True;
end;
end;
procedure TIBXSQLVAR.SetAsFloat(Value: Float);
var
i: Integer;
xvar: TIBXSQLVAR;
begin
if IsNullable then
IsNull := False;
for i := 0 to FParent.FCount - 1 do
if FParent.FNames[i] = FName then
begin
xvar := FParent[i];
xvar.FXSQLVAR^.sqltype := SQL_FLOAT or (xvar.FXSQLVAR^.sqltype and 1);
xvar.FXSQLVAR^.sqllen := SizeOf(Float);
xvar.FXSQLVAR^.sqlscale := 0;
IBAlloc(xvar.FXSQLVAR^.sqldata, 0, xvar.FXSQLVAR^.sqllen);
PSingle(xvar.FXSQLVAR^.sqldata)^ := Value;
xvar.FModified := True;
end;
end;
procedure TIBXSQLVAR.SetAsLong(Value: Long);
var
i: Integer;
xvar: TIBXSQLVAR;
begin
if IsNullable then
IsNull := False;
for i := 0 to FParent.FCount - 1 do
if FParent.FNames[i] = FName then
begin
xvar := FParent[i];
xvar.FXSQLVAR^.sqltype := SQL_LONG or (xvar.FXSQLVAR^.sqltype and 1);
xvar.FXSQLVAR^.sqllen := SizeOf(Long);
xvar.FXSQLVAR^.sqlscale := 0;
IBAlloc(xvar.FXSQLVAR^.sqldata, 0, xvar.FXSQLVAR^.sqllen);
PLong(xvar.FXSQLVAR^.sqldata)^ := Value;
xvar.FModified := True;
end;
end;
procedure TIBXSQLVAR.SetAsPointer(Value: Pointer);
var
i: Integer;
xvar: TIBXSQLVAR;
begin
if IsNullable and (Value = nil) then
IsNull := True
else begin
IsNull := False;
for i := 0 to FParent.FCount - 1 do
if FParent.FNames[i] = FName then
begin
xvar := FParent[i];
xvar.FXSQLVAR^.sqltype := SQL_TEXT or (FXSQLVAR^.sqltype and 1);
Move(Value^, xvar.FXSQLVAR^.sqldata^, xvar.FXSQLVAR^.sqllen);
xvar.FModified := True;
end;
end;
end;
procedure TIBXSQLVAR.SetAsQuad(Value: TISC_QUAD);
var
i: Integer;
xvar: TIBXSQLVAR;
begin
if IsNullable then
IsNull := False;
for i := 0 to FParent.FCount - 1 do
if FParent.FNames[i] = FName then
begin
xvar := FParent[i];
if (xvar.FXSQLVAR^.sqltype and (not 1) <> SQL_BLOB) and
(xvar.FXSQLVAR^.sqltype and (not 1) <> SQL_ARRAY) then
IBError(ibxeInvalidDataConversion, [nil]);
xvar.FXSQLVAR^.sqllen := SizeOf(TISC_QUAD);
IBAlloc(xvar.FXSQLVAR^.sqldata, 0, xvar.FXSQLVAR^.sqllen);
PISC_QUAD(xvar.FXSQLVAR^.sqldata)^ := Value;
xvar.FModified := True;
end;
end;
procedure TIBXSQLVAR.SetAsShort(Value: Short);
var
i: Integer;
xvar: TIBXSQLVAR;
begin
if IsNullable then
IsNull := False;
for i := 0 to FParent.FCount - 1 do
if FParent.FNames[i] = FName then
begin
xvar := FParent[i];
xvar.FXSQLVAR^.sqltype := SQL_SHORT or (xvar.FXSQLVAR^.sqltype and 1);
xvar.FXSQLVAR^.sqllen := SizeOf(Short);
xvar.FXSQLVAR^.sqlscale := 0;
IBAlloc(xvar.FXSQLVAR^.sqldata, 0, xvar.FXSQLVAR^.sqllen);
PShort(xvar.FXSQLVAR^.sqldata)^ := Value;
xvar.FModified := True;
end;
end;
procedure TIBXSQLVAR.SetAsString(Value: String);
var
stype: Integer;
ss: TStringStream;
procedure SetStringValue;
var
i: Integer;
xvar: TIBXSQLVAR;
begin
for i := 0 to FParent.FCount - 1 do
if FParent.FNames[i] = FName then
begin
xvar := FParent[i];
if (xvar.FXSQLVAR^.sqlname = 'DB_KEY') or {do not localize}
(xvar.FXSQLVAR^.sqlname = 'RDB$DB_KEY') then {do not localize}
Move(Value[1], xvar.FXSQLVAR^.sqldata^, xvar.FXSQLVAR^.sqllen)
else
begin
xvar.FXSQLVAR^.sqltype := SQL_TEXT or (FXSQLVAR^.sqltype and 1);
if (FMaxLen > 0) and (Length(Value) > FMaxLen) then
IBError(ibxeStringTooLarge, [Length(Value), FMaxLen]);
xvar.FXSQLVAR^.sqllen := Length(Value);
IBAlloc(xvar.FXSQLVAR^.sqldata, 0, xvar.FXSQLVAR^.sqllen + 1);
if (Length(Value) > 0) then
Move(Value[1], xvar.FXSQLVAR^.sqldata^, xvar.FXSQLVAR^.sqllen);
end;
xvar.FModified := True;
end;
end;
begin
if IsNullable then
IsNull := False;
stype := FXSQLVAR^.sqltype and (not 1);
if (stype = SQL_TEXT) or (stype = SQL_VARYING) then
SetStringValue
else
begin
if (stype = SQL_BLOB) then
begin
ss := TStringStream.Create(Value);
try
LoadFromStream(ss);
finally
ss.Free;
end;
end
else
if Value = '' then
IsNull := True
else
if (stype = SQL_TIMESTAMP) or (stype = SQL_TYPE_DATE) or
(stype = SQL_TYPE_TIME) then
SetAsDateTime(StrToDateTime(Value))
else
SetStringValue;
end;
end;
procedure TIBXSQLVAR.SetAsVariant(Value: Variant);
begin
if VarIsNull(Value) then
IsNull := True
else
case VarType(Value) of
varEmpty, varNull:
IsNull := True;
varSmallint, varInteger, varByte:
AsLong := Value;
varSingle, varDouble:
AsDouble := Value;
varCurrency:
AsCurrency := Value;
varBoolean:
if Value then
AsLong := ISC_TRUE
else
AsLong := ISC_FALSE;
varDate:
AsDateTime := Value;
varOleStr, varString:
AsString := Value;
varArray:
IBError(ibxeNotSupported, [nil]);
varByRef, varDispatch, varError, varUnknown, varVariant:
IBError(ibxeNotPermitted, [nil]);
end;
end;
procedure TIBXSQLVAR.SetAsXSQLVAR(Value: PXSQLVAR);
var
i: Integer;
xvar: TIBXSQLVAR;
sqlind: PShort;
sqldata: PChar;
local_sqllen: Integer;
begin
for i := 0 to FParent.FCount - 1 do
if FParent.FNames[i] = FName then
begin
xvar := FParent[i];
sqlind := xvar.FXSQLVAR^.sqlind;
sqldata := xvar.FXSQLVAR^.sqldata;
Move(Value^, xvar.FXSQLVAR^, SizeOf(TXSQLVAR));
xvar.FXSQLVAR^.sqlind := sqlind;
xvar.FXSQLVAR^.sqldata := sqldata;
if (Value^.sqltype and 1 = 1) then
begin
if (xvar.FXSQLVAR^.sqlind = nil) then
IBAlloc(xvar.FXSQLVAR^.sqlind, 0, SizeOf(Short));
xvar.FXSQLVAR^.sqlind^ := Value^.sqlind^;
end
else
if (xvar.FXSQLVAR^.sqlind <> nil) then
ReallocMem(xvar.FXSQLVAR^.sqlind, 0);
if ((xvar.FXSQLVAR^.sqltype and (not 1)) = SQL_VARYING) then
local_sqllen := xvar.FXSQLVAR^.sqllen + 2
else
local_sqllen := xvar.FXSQLVAR^.sqllen;
FXSQLVAR^.sqlscale := Value^.sqlscale;
IBAlloc(xvar.FXSQLVAR^.sqldata, 0, local_sqllen);
Move(Value^.sqldata[0], xvar.FXSQLVAR^.sqldata[0], local_sqllen);
xvar.FModified := True;
end;
end;
procedure TIBXSQLVAR.SetIsNull(Value: Boolean);
var
i: Integer;
xvar: TIBXSQLVAR;
begin
if Value then
begin
if not IsNullable then
IsNullable := True;
for i := 0 to FParent.FCount - 1 do
if FParent.FNames[i] = FName then
begin
xvar := FParent[i];
if Assigned(xvar.FXSQLVAR^.sqlind) then
xvar.FXSQLVAR^.sqlind^ := -1;
xvar.FModified := True;
end;
end
else
if ((not Value) and IsNullable) then
begin
for i := 0 to FParent.FCount - 1 do
if FParent.FNames[i] = FName then
begin
xvar := FParent[i];
if Assigned(xvar.FXSQLVAR^.sqlind) then
xvar.FXSQLVAR^.sqlind^ := 0;
xvar.FModified := True;
end;
end;
end;
procedure TIBXSQLVAR.SetIsNullable(Value: Boolean);
var
i: Integer;
xvar: TIBXSQLVAR;
begin
for i := 0 to FParent.FCount - 1 do
if FParent.FNames[i] = FName then
begin
xvar := FParent[i];
if (Value <> IsNullable) then
begin
if Value then
begin
xvar.FXSQLVAR^.sqltype := xvar.FXSQLVAR^.sqltype or 1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -