RE : [fpc-pascal] Bump: Trouble setting/getting ftVarBytes field data inTBufDataset

2011-08-03 Thread Ludo Brands


 On 2-8-2011 7:39, Reinier Olislagers wrote:
  I've got trouble finding out how to fill and retrieve data for a 
  ftVarBytes field in a TBufDataset.
  
  .AsString doesn't seem to work well - if I fill it with the 
 string How 
  do I fill this field? I get back
  How
  
  I tried SetData, which takes a buffer as data, so I tried filling a 
  PChar with the string data. Retrieving it leads to a big dump of 
  memory, so I wonder how you define the end of the buffer in the 
  SetData call.
  
  Hope somebody can point me to some documentation or tell me 
 the proper 
  way to do this. I've looked at Delphi docs, but that dealt 
 mostly with 
  general BLOB fields, don't know if that includes varBytes.
  
  Below some test code and output:
  program varbytesproject;
  
  {$mode objfpc}{$H+}
  {$APPTYPE CONSOLE}
  
  uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Classes, SysUtils,
{ you can add units after this }
DB, BufDataSet;
  
  var
TestDataset: TBufDataset;
FieldDef: TFieldDef;
TestString: String;
TempPChar: PChar;
  begin
TestDataset := TBufDataset.Create(nil);
FieldDef := TestDataset.FieldDefs.AddFieldDef;
FieldDef.Name := 'ftVarBytes';
FieldDef.DataType := ftVarBytes;
FieldDef.Size := 2;
TestDataset.CreateDataSet;
TestDataset.Open;
TestDataset.Append;
  
writeln('1. How do I fill an ftVarBytes field?');
Teststring:='How do I fill this field?';
writeln('2. Like this?');
TestDataset.FieldByName('ftVarBytes').Asstring := Teststring;
writeln('ftVarbytes.AsString: ' + 
  TestDataset.FieldByName('ftVarBytes').AsString);

This is the way to do it. However:
- FieldDef.Size := 2; You only store 2 characters. 
- TCustomBufDataset.GetFieldSize doesn't recognise TBinaryField descendants
and fixes their length arbitrary as 10 bytes... Setting fieldsize to more
than 10 bytes won't store more than 10 chars. TMemDataset handles this more
elegantly by raising a SErrFieldTypeNotSupported.
So the answer is that TBufDataset doesn' support TBinaryField descendants
correctly.

For test purposes, limit field size to 10 bytes ;)

Ludo


___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal


Re: RE : [fpc-pascal] Bump: Trouble setting/getting ftVarBytes field data inTBufDataset

2011-08-03 Thread Reinier Olislagers
On 3-8-2011 12:32, Ludo Brands wrote:
 On 2-8-2011 7:39, Reinier Olislagers wrote:
 I've got trouble finding out how to fill and retrieve data for a 
 ftVarBytes field in a TBufDataset.
   TestDataset.FieldByName('ftVarBytes').Asstring := Teststring;
   writeln('ftVarbytes.AsString: ' + 
 TestDataset.FieldByName('ftVarBytes').AsString);
 
 This is the way to do it. However:
 - FieldDef.Size := 2; You only store 2 characters. 
Oops. Correct.
 - TCustomBufDataset.GetFieldSize doesn't recognise TBinaryField descendants
 and fixes their length arbitrary as 10 bytes... Setting fieldsize to more
 than 10 bytes won't store more than 10 chars. TMemDataset handles this more
 elegantly by raising a SErrFieldTypeNotSupported.
 So the answer is that TBufDataset doesn' support TBinaryField descendants
 correctly.
 
 For test purposes, limit field size to 10 bytes ;)
Thanks for the answer, I will ;)
(I'll have a go at adding this info to the wiki as well)

Reinier
___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal