Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / fpc-devel / 2009-07

TBufDataSet Stream Error

2 messages · 2 people · –

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

Dimitrios Chr. Ioannidis

Hi,

i'm trying to use TBufDataset as a very simple mem dataset but i get a "Stream read error".

I can reproduce it, but first is it legitimate to use TBufDataset like this ?

unit Unit2;
{$mode objfpc}{$H+}
interface

uses
Classes, SysUtils, db, FileUtil, LResources, Forms, Controls, Dialogs, bufdataset;

type
  { TDataModule1 }
  TDataModule1 = class(TDataModule)
    Datasource1: TDatasource;
    procedure DataModuleCreate(Sender: TObject);
    procedure DataModuleDestroy(Sender: TObject);
  private
    { private declarations }
    FTest: TBufDataset;
    procedure CreateDB;
  public
    { public declarations }
  end;
var
  DataModule1: TDataModule1;
implementation

{ TDataModule1 }

var
  sDBFileName: string;
procedure TDataModule1.DataModuleCreate(Sender: TObject);
begin
  FTest := TBufDataset.Create(Self);
  if not FileExists(sDBFileName) then
    CreateDB
  else
    FTest.LoadFromFile(sDBFileName);
  DataSource1.DataSet := FTest;
  FTest.Open;
end;
procedure TDataModule1.DataModuleDestroy(Sender: TObject);
begin
  if FTest.State in [dsEdit, dsInsert] then
    FTest.Post;
  FTest.SaveToFile(sDBFileName);
end;
procedure TDataModule1.CreateDB;
begin
  FTest.FieldDefs.Add('ID', ftInteger, 0, False);
  FTest.FieldDefs.Add('FirstName', ftString, 20, False);
  FTest.FieldDefs.Add('LastName', ftString, 20, False);
  FTest.CreateDataset;
end;
initialization
  {$I unit2.lrs}
  sDBFileName := ExtractFilePath(Application.ExeName) + 'TestDB.db';
end.

Reply by email

Joost van der Sluis
to Dimitrios Chr. Ioannidis

Op woensdag 22-07-2009 om 00:54 uur [tijdzone +0300], schreef Dimitrios Chr. Ioannidis:

Show quoted text 7 lines
Hi, i'm trying to use TBufDataset as a very simple mem dataset but i get a "Stream read error". I can reproduce it, but first is it legitimate to use TBufDataset like this ?

Yes, it should work. I tried the following program (just re-arranged your code somewhat) and that worked. (It created the database-file) Maybe you should try fpc 2.3.1/2.5.1. (the development-versions)

program Project1;
{$mode objfpc}{$H+}
uses
  Classes, SysUtils, db, BufDataset;
const sDBFileName = 'database.db';
var FTest : TBufDataset;
procedure CreateDB;
begin
  FTest.FieldDefs.Add('ID', ftInteger, 0, False);
  FTest.FieldDefs.Add('FirstName', ftString, 20, False);
  FTest.FieldDefs.Add('LastName', ftString, 20, False);
  FTest.CreateDataset;
end;
begin
  FTest := TBufDataset.Create(nil);
  if not FileExists(sDBFileName) then
    CreateDB
  else
    FTest.LoadFromFile(sDBFileName);
//  DataSource1.DataSet := FTest;
  FTest.Open;
  //write
  FTest.Append;
  FTest.Fields[1].AsString:='jojojojojo';
  // or read
  //writeln(FTest.fields[1].asstring);
  if FTest.State in [dsEdit, dsInsert] then
    FTest.Post;
  FTest.SaveToFile(sDBFileName);
end.
Show quoted text 72 lines
unit Unit2; {$mode objfpc}{$H+} interface uses Classes, SysUtils, db, FileUtil, LResources, Forms, Controls, Dialogs, bufdataset; type { TDataModule1 } TDataModule1 = class(TDataModule) Datasource1: TDatasource; procedure DataModuleCreate(Sender: TObject); procedure DataModuleDestroy(Sender: TObject); private { private declarations } FTest: TBufDataset; procedure CreateDB; public { public declarations } end; var DataModule1: TDataModule1; implementation { TDataModule1 } var sDBFileName: string; procedure TDataModule1.DataModuleCreate(Sender: TObject); begin FTest := TBufDataset.Create(Self); if not FileExists(sDBFileName) then CreateDB else FTest.LoadFromFile(sDBFileName); DataSource1.DataSet := FTest; FTest.Open; end; procedure TDataModule1.DataModuleDestroy(Sender: TObject); begin if FTest.State in [dsEdit, dsInsert] then FTest.Post; FTest.SaveToFile(sDBFileName); end; procedure TDataModule1.CreateDB; begin FTest.FieldDefs.Add('ID', ftInteger, 0, False); FTest.FieldDefs.Add('FirstName', ftString, 20, False); FTest.FieldDefs.Add('LastName', ftString, 20, False); FTest.CreateDataset; end; initialization {$I unit2.lrs} sDBFileName := ExtractFilePath(Application.ExeName) + 'TestDB.db'; end. _______________________________________________ fpc-devel maillist - http://lists.freepascal.org/mailman/listinfo/fpc-devel

Reply by email