[fpc-devel] TFieldDef.Size vs TField.Size

michael.vancanneyt at wisa.be michael.vancanneyt at wisa.be
Thu Feb 24 11:11:47 CET 2011



On Thu, 24 Feb 2011, LacaK wrote:

> See please 
> http://svn.freepascal.org/cgi-bin/viewvc.cgi/trunk/packages/fcl-db/src/sqldb/odbc/odbcconn.pas?r1=16094&r2=16988
> And look at ftWideString, ftFixedWideChar cases
> What happens if we have NVARCHAR(20) column on MS SQL Server (uses UCS-2 
> 1char=2bytes):
> 1. in AddFieldDefs method is created TFieldDef object with Size=20*2 (because 
> FieldSize:=ColumnSize*sizeof(Widechar))
> 2. later when TField objects are created in TFieldDef.CreateField method, 
> TWideString object is created with Size=40 (because Size is copied from 
> TFieldDef object) ... and this is wrong, because:
> 2.1 TWideString.Size should IMO return max.number of characters ... Size is 
> used for example in data-aware controls to limit MaxLength
> 2.2 TWideStringField.GetDataSize will return 82, which is also wrong 
> (because (40+1)*2)
> 2.3 in record buffer will be allocated also 82 bytes (because of 
> TCustomBufDataset.GetFieldSize)
>
> So IMO correct will be in step 1 FieldSize:=ColumnSize not 
> FieldSize:=ColumnSize*sizeof(WideChar)
> (like in my original fix in bug report)

This seems correct, yes.

>
> Note also, that Size is used (also in Delphi) to limit the number of 
> characters in data-aware controls (for ftString, ftWideString), so it must be 
> number of characters in both cases.
>
>> 
>> Do you see an implementation problem or a documentation problem ?
> Implementation problem at first
> but also Documentation is confusing, because do not clearly says about 
> menaing of TWideStringField.Size (only indirect guess can be done, that it is 
> inherited from TStringField.Size, so it is number of characters)
> See, that also other users are confusing by it 
> https://forums.embarcadero.com/thread.jspa?messageID=188792

Yes, but that is an embarcadero bug :-)

>
>> 
>> Note that nowhere in the documentation pages you mention, widestrings are
>> mentioned (which is convenient, since that's where 1 char <> 1 byte).
>> 
> Yes, but in Delphi6 help is for TWideStringField.DataSize:
> "Inspect DataSize to determine the number of bytes required to store the 
> fields value. Use DataSize to determine the size needed for a buffer when 
> working with the GetData and SetData methods.
> For wide string fields, DataSize is the value of the Size property plus one 
> (for the trailing NULL character), multiplied by two."
>
> So we can estimate, that Size is number of characters, while 
> DataSize=(Size+1)*2

Indeed.

Michael.



More information about the fpc-devel mailing list