février
2009
16e pisode
2.2.6 – Créer une nouvelle base de données
Nous pouvons maintenant gérer les personnes dans une table PEOPLE. Ce que nous ne pouvons pas faire, c’est créer un nouveau fichier de base de données de la même façon que nous avons créé de nouveaux fichiers-textes. Nous allons donc rajouter cette fonctionnalité à notre application.
begin
if not(ExtractFileExt(CurrentFileName) = '.fdb') then
if (MessageDlg('Voulez-vous enregistrer le fichier courant ?',
mtWarning, [mbYes, mbNo], 0) = mrYes)
then
aSaveExecute(Sender);
People.Clear;
ListBox1.Clear;
SaveDialog1.InitialDir := ExtractFilePath(CurrentFileName);
if SaveDialog1.Execute then
CurrentFileName := SaveDialog1.FileName;
if ExtractFileExt(CurrentFileName) = '.fdb' then begin
Visitor := TSQLCreatePeople.Create;
try
People.AcceptBizObjVisitor(Visitor);
finally
Visitor.Free;
end;
Self.Caption := ExtractFileName(CurrentFileName);
aSave.Enabled := False;
aSaveAs.Enabled := False;
end;
end;
Si à partir de l’interface nous demandons à créer un nouveau fichier, nous devrons maintenant définir le nom du fichier. Si ce fichier est un fichier Firebird (extension .fdb), nous appliquons le visiteur TSQLCreatePeople à People, ce qui a pour effet de créer une nouvelle base de données dans sa méthode Create. Nous prenons soin d’afficher le nouveau nom de fichier dans l’interface et nous désactivons les actions de sauvegarde.
Pour que la nouvelle base soit créée, nous modifions la méthode TSQLFirebird.Create comme suit:
begin
// aFileName must have .fdb extension
if ExtractFileExt(aFileName) <> '.fdb' then
ChangeFileExt(aFileName, '.fdb');
FDatabaseName := aFileName;
inherited Create(aFileName);
//connexion à la base de données
FDB := TIBDatabase.Create(nil);
with FDB do
begin
DatabaseName := FDatabaseName;
Params.Clear;
if FileExists(FDatabaseName) then
begin
Params.Add('user_name=SYSDBA');
Params.Add('password=cm5z2p3r');
end
else begin
Params.Add('USER ''SYSDBA''');
Params.Add('PASSWORD ''cm5z2p3r''');
Params.Add('PAGE_SIZE 4096');
FDB.CreateDatabase;
end;
LoginPrompt := False;
Connected := True;
end;
...//la suite est inchangée
end;
Ensuite le visiteur se charge de créer la table PEOPLE. Il nous suffit pour cela de définir la méthode Init puis d’appeler la méthode VisitBizObj de l’ancêtre TSQLCreate.
******************************* TSQLCreatePeople *******************************
}
procedure TSQLCreatePeople.Init;
begin
FQuery.SQL.Clear;
FQuery.SQL.Add('CREATE TABLE PEOPLE (');
FQuery.SQL.Add('OID INTEGER,');
FQuery.SQL.Add('LastName VARCHAR(20),');
FQuery.SQL.Add('FirstName VARCHAR(20),');
FQuery.SQL.Add('BirthDate DATE);');
end;
procedure TSQLCreatePeople.SetupParams;
begin
//no params
end;
procedure TSQLCreatePeople.VisitBizObj(Visited: TBizObj);
begin
if not(Visited is TPeople) then
Exit;
inherited VisitBizObj(Visited);
end;
{
********************************** TSQLCreate **********************************
}
procedure TSQLCreate.VisitBizObj(Visited: TBizObj);
begin
inherited VisitBizObj(Visited);
Init; // Set the SQL. Implemented in the concrete class
FQuery.ExecSQL;
end;