|
@@ -662,7 +662,13 @@ begin
|
|
|
|
|
|
FD := TFieldDef.Create(FieldDefs, FieldDefs.MakeNameUnique(SQLDA^.SQLVar[x].AliasName), TransType,
|
|
FD := TFieldDef.Create(FieldDefs, FieldDefs.MakeNameUnique(SQLDA^.SQLVar[x].AliasName), TransType,
|
|
TransLen, (SQLDA^.SQLVar[x].sqltype and 1)=0, (x + 1));
|
|
TransLen, (SQLDA^.SQLVar[x].sqltype and 1)=0, (x + 1));
|
|
- if TransType = ftBCD then FD.precision := SQLDA^.SQLVar[x].SQLLen;
|
|
|
|
|
|
+ if TransType = ftBCD then
|
|
|
|
+ case (SQLDA^.SQLVar[x].sqltype and not 1) of
|
|
|
|
+ SQL_SHORT : FD.precision := 4;
|
|
|
|
+ SQL_LONG : FD.precision := 9;
|
|
|
|
+ SQL_INT64 : FD.precision := 18;
|
|
|
|
+ else FD.precision := SQLDA^.SQLVar[x].SQLLen;
|
|
|
|
+ end;
|
|
// FD.DisplayName := SQLDA^.SQLVar[x].AliasName;
|
|
// FD.DisplayName := SQLDA^.SQLVar[x].AliasName;
|
|
FieldBinding[FD.FieldNo-1] := x;
|
|
FieldBinding[FD.FieldNo-1] := x;
|
|
end;
|
|
end;
|
|
@@ -738,39 +744,42 @@ var ParNr,SQLVarNr : integer;
|
|
end;
|
|
end;
|
|
|
|
|
|
var
|
|
var
|
|
- VSQLVar: XSQLVAR;
|
|
|
|
|
|
+ // This should be a pointer, because the ORIGINAL variables must
|
|
|
|
+ // be modified.
|
|
|
|
+ VSQLVar: ^XSQLVAR;
|
|
|
|
+
|
|
begin
|
|
begin
|
|
{$R-}
|
|
{$R-}
|
|
with cursor as TIBCursor do for SQLVarNr := 0 to High(ParamBinding){AParams.count-1} do
|
|
with cursor as TIBCursor do for SQLVarNr := 0 to High(ParamBinding){AParams.count-1} do
|
|
begin
|
|
begin
|
|
ParNr := ParamBinding[SQLVarNr];
|
|
ParNr := ParamBinding[SQLVarNr];
|
|
- VSQLVar := in_sqlda^.SQLvar[SQLVarNr];
|
|
|
|
|
|
+ VSQLVar := @in_sqlda^.SQLvar[SQLVarNr];
|
|
if AParams[ParNr].IsNull then
|
|
if AParams[ParNr].IsNull then
|
|
begin
|
|
begin
|
|
- If Assigned(VSQLVar.SQLInd) then
|
|
|
|
- VSQLVar.SQLInd^ := -1;
|
|
|
|
|
|
+ If Assigned(VSQLVar^.SQLInd) then
|
|
|
|
+ VSQLVar^.SQLInd^ := -1;
|
|
end
|
|
end
|
|
else
|
|
else
|
|
begin
|
|
begin
|
|
- if assigned(VSQLVar.SQLInd) then VSQLVar.SQLInd^ := 0;
|
|
|
|
|
|
+ if assigned(VSQLVar^.SQLInd) then VSQLVar^.SQLInd^ := 0;
|
|
|
|
|
|
- case (VSQLVar.sqltype and not 1) of
|
|
|
|
|
|
+ case (VSQLVar^.sqltype and not 1) of
|
|
SQL_LONG :
|
|
SQL_LONG :
|
|
begin
|
|
begin
|
|
- if VSQLVar.sqlscale = 0 then
|
|
|
|
|
|
+ if VSQLVar^.sqlscale = 0 then
|
|
i := AParams[ParNr].AsInteger
|
|
i := AParams[ParNr].AsInteger
|
|
else
|
|
else
|
|
- i := Round(AParams[ParNr].AsCurrency * IntPower(10, -VSQLVar.sqlscale));
|
|
|
|
- Move(i, VSQLVar.SQLData^, VSQLVar.SQLLen);
|
|
|
|
|
|
+ i := Round(AParams[ParNr].AsCurrency * IntPower(10, -VSQLVar^.sqlscale));
|
|
|
|
+ Move(i, VSQLVar^.SQLData^, VSQLVar^.SQLLen);
|
|
end;
|
|
end;
|
|
SQL_SHORT :
|
|
SQL_SHORT :
|
|
begin
|
|
begin
|
|
- if VSQLVar.sqlscale = 0 then
|
|
|
|
|
|
+ if VSQLVar^.sqlscale = 0 then
|
|
si := AParams[ParNr].AsSmallint
|
|
si := AParams[ParNr].AsSmallint
|
|
else
|
|
else
|
|
- si := Round(AParams[ParNr].AsCurrency * IntPower(10, -VSQLVar.sqlscale));
|
|
|
|
|
|
+ si := Round(AParams[ParNr].AsCurrency * IntPower(10, -VSQLVar^.sqlscale));
|
|
i := si;
|
|
i := si;
|
|
- Move(i, VSQLVar.SQLData^, VSQLVar.SQLLen);
|
|
|
|
|
|
+ Move(i, VSQLVar^.SQLData^, VSQLVar^.SQLLen);
|
|
end;
|
|
end;
|
|
SQL_BLOB :
|
|
SQL_BLOB :
|
|
SetBlobParam;
|
|
SetBlobParam;
|
|
@@ -778,30 +787,30 @@ begin
|
|
begin
|
|
begin
|
|
s := AParams[ParNr].AsString;
|
|
s := AParams[ParNr].AsString;
|
|
w := length(s); // a word is enough, since the max-length of a string in interbase is 32k
|
|
w := length(s); // a word is enough, since the max-length of a string in interbase is 32k
|
|
- if ((VSQLVar.SQLType and not 1) = SQL_VARYING) then
|
|
|
|
|
|
+ if ((VSQLVar^.SQLType and not 1) = SQL_VARYING) then
|
|
begin
|
|
begin
|
|
- VSQLVar.SQLLen := w;
|
|
|
|
- ReAllocMem(VSQLVar.SQLData, VSQLVar.SQLLen+2);
|
|
|
|
- CurrBuff := VSQLVar.SQLData;
|
|
|
|
|
|
+ VSQLVar^.SQLLen := w;
|
|
|
|
+ ReAllocMem(VSQLVar^.SQLData, VSQLVar^.SQLLen+2);
|
|
|
|
+ CurrBuff := VSQLVar^.SQLData;
|
|
move(w,CurrBuff^,sizeof(w));
|
|
move(w,CurrBuff^,sizeof(w));
|
|
inc(CurrBuff,2);
|
|
inc(CurrBuff,2);
|
|
end
|
|
end
|
|
else
|
|
else
|
|
- CurrBuff := VSQLVar.SQLData;
|
|
|
|
|
|
+ CurrBuff := VSQLVar^.SQLData;
|
|
Move(s[1], CurrBuff^, w);
|
|
Move(s[1], CurrBuff^, w);
|
|
end;
|
|
end;
|
|
SQL_TYPE_DATE, SQL_TYPE_TIME, SQL_TIMESTAMP :
|
|
SQL_TYPE_DATE, SQL_TYPE_TIME, SQL_TIMESTAMP :
|
|
- SetDateTime(VSQLVar.SQLData, AParams[ParNr].AsDateTime, VSQLVar.SQLType);
|
|
|
|
|
|
+ SetDateTime(VSQLVar^.SQLData, AParams[ParNr].AsDateTime, VSQLVar^.SQLType);
|
|
SQL_INT64:
|
|
SQL_INT64:
|
|
begin
|
|
begin
|
|
- if VSQLVar.sqlscale = 0 then
|
|
|
|
|
|
+ if VSQLVar^.sqlscale = 0 then
|
|
li := AParams[ParNr].AsLargeInt
|
|
li := AParams[ParNr].AsLargeInt
|
|
else
|
|
else
|
|
- li := Round(AParams[ParNr].AsCurrency * IntPower(10, -VSQLVar.sqlscale));
|
|
|
|
- Move(li, VSQLVar.SQLData^, VSQLVar.SQLLen);
|
|
|
|
|
|
+ li := Round(AParams[ParNr].AsCurrency * IntPower(10, -VSQLVar^.sqlscale));
|
|
|
|
+ Move(li, VSQLVar^.SQLData^, VSQLVar^.SQLLen);
|
|
end;
|
|
end;
|
|
SQL_DOUBLE, SQL_FLOAT:
|
|
SQL_DOUBLE, SQL_FLOAT:
|
|
- SetFloat(VSQLVar.SQLData, AParams[ParNr].AsFloat, VSQLVar.SQLLen);
|
|
|
|
|
|
+ SetFloat(VSQLVar^.SQLData, AParams[ParNr].AsFloat, VSQLVar^.SQLLen);
|
|
else
|
|
else
|
|
DatabaseErrorFmt(SUnsupportedParameter,[Fieldtypenames[AParams[ParNr].DataType]],self);
|
|
DatabaseErrorFmt(SUnsupportedParameter,[Fieldtypenames[AParams[ParNr].DataType]],self);
|
|
end {case}
|
|
end {case}
|