[fpc-pascal] Bump: Trouble setting/getting ftVarBytes field data in TBufDataset

Reinier Olislagers reinierolislagers at gmail.com
Wed Aug 3 03:27:26 CEST 2011


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);
> 
>   writeln('3. Or like this?');
>   TempPChar:=PChar(TestString);
>   TestDataSet.FieldByName('ftVarBytes').SetData(TempPChar);
>   writeln('ftVarbytes.AsString: ' +
> TestDataset.FieldByName('ftVarBytes').AsString);
>   TestDataset.Post;
> 
>   writeln('4. Get data using this:');
>   writeln('ftVarbytes.AsString: ' +
> TestDataset.FieldByName('ftVarBytes').AsString);
>   writeln('5. Or get data using this:');
>   TempPchar:='';
>   if TestDataset.FieldByName('ftVarBytes').GetData(TempPChar) then
>   begin
>     writeln('We filled TempPChar with: ' + TempPChar);
>   end
>   else
>   begin
>     writeln('The Getdata function didn''t work.');
>   end;
>   TestDataset.Close;
>   TestDataset.Free;
> end.
> 
> Output:
> 1. How do I fill an ftVarBytes field?
> 2. Like this?
> ftVarbytes field contains: How
> 3. Or like this?
> ftVarbytes field contains: How
> 4. Get data using this:
> ftVarbytes field contains: How
> 5. Or get data using this:
> We filled TempPChar with:
> 
> !The Getdata function didn't work.
> 
> 
> 
> 
> 
> TObject♦
> <snip more data from memory>

Does anybody have a suggestion on how to use ftVarbytes fields or aren't
they supported in FPC?



More information about the fpc-pascal mailing list