Wrong Field Size calculations

NDzubiel

Member²
Marco,

could you please check the following fixes:

ds := Size * 2 + 2; was ds := Size * 2;

function TOracleDataset.GetRecBufSize: Integer;
var i: Integer;
ds: Integer;
FI: TOracleFieldInfo;
begin
Result := 0;
FRecordSize := 0;
for i := 0 to FieldCount - 1 do with Fields do
begin
FI := FieldInfoList.ForField(Fields);
if FieldNo >= 0 then
begin
FI.FieldOffset := FRecordSize;
ds := FI.RealDataSize;
end else
begin
ds := DataSize;
if DataType = ftWideString then ds := Size * 2 + 2;
end;
Inc(Result, ds + 1);
if FieldKind in [fkData, fkInternalCalc] then Inc(FRecordSize, ds + 1);
end;
Inc(Result, RecInfoSize);
end;

Next:

Result := AField.Size * 2 + 2 was Result = AField.Size

function TOracleDataSet.RealFieldDataSize(AField: TField): Integer;
var FI: TOracleFieldInfo;
begin
FI := FieldInfoList.ForField(AField);
if FI nil then
Result := FI.RealDataSize
else
if AField.DataType = ftWideString then
Result := AField.Size * 2 + 2
else
Result := AField.DataSize;
end;

Next:

function TOracleFieldInfo.RealDataSize: Integer;
begin
if Field.IsBLOB then
Result := 0
else begin
Result := Field.DataSize;
if Field.DataType = ftWideString then
begin
//if IsUTF16 then
Result := Field.Size * 2 + 2
//else
// Result := Field.Size + 1;
end;
end;
end;

regards

Nils
 
I am using 4.1.3 - when you use TWIDESTING Fields - e.g.
varchar (80 char) and insert/edit the 80th character gets
lost ... I traced it to:

procedure TOracleDataSet.FieldToRecord(Field: TField; FieldIsNull: Boolean;
FieldData: Pointer; RecordData: PRecordData);
var OffSet, DataSize: Integer;
begin
OffSet := FieldOffset(Field);
DataSize := FieldInfoList.ForField(Field).RealDataSize;
//DataSize := RealFieldDataSize (Field);
if FieldIsNull then
RecordData^.Bytes[Offset] := 1
else begin
RecordData^.Bytes[Offset] := 0;
{$IFNDEF LINUX}
if RecordData.ArraySize < Offset + 1 + DataSize then MessageBeep($FFFF);
{$ENDIF}
Move(FieldData^, RecordData^.Bytes[OffSet + 1], DataSize);
if Field is TStringField then
RecordData^.Bytes[OffSet + DataSize] := 0;
end;
end;

"if Field is TStringField then
RecordData^.Bytes[OffSet + DataSize] := 0;"

will overwrite the last character - this means that you get a "Record has benn changed by another user" ..

Nils

 
Back
Top