Création et suppression des tables

De RAD Studio
Aller à : navigation, rechercher

Remonter à Utilisation d'ensembles de données de type table


Certains ensembles de données de type table vous permettent de créer et de supprimer les tables sous-jacentes, à la conception ou à l'exécution. En général, les tables de base de données sont créées et supprimées par l'administrateur de la base. Mais, il peut être pratique au cours du développement et des tests de créer et de détruire des tables utilisées par votre application.

Création de tables

TTable et TIBTable vous permettent tous deux de créer la table de base de données sous-jacente sans utiliser SQL. De même, TClientDataSet vous permet de créer un ensemble de données quand vous ne travaillez pas avec un fournisseur d'ensemble de données. En utilisant TTable et TClientDataSet, vous pouvez créer la table pendant la conception ou pendant l'exécution. TIBTable vous permet de créer des tables uniquement à l'exécution.

Avant de créer la table, vous devez définir des propriétés pour spécifier la structure de la table que vous créez. En particulier, vous devez spécifier

  • La base de données qui contiendra la nouvelle table. Pour TTable, vous spécifiez la base de données en utilisant la propriété DatabaseName. Pour TIBTable, vous devez utiliser un composant TIBDatabase, qui est affecté à la propriété Database. (Les ensembles de données client n'utilisent pas de base de données.)
  • Le type de base de données (TTable seulement). Définissez la propriété TableType par le type de table souhaité. Pour les tables Paradox, dBASE ou ASCII, définissez TableType par ttParadox, ttDBase ou ttASCII, respectivement. Pour tous les autres types de tables, définissez TableType par ttDefault.
  • Le nom de la table que vous voulez créer. TTable et TIBTable ont tous deux une propriété TableName pour stocker le nom de la nouvelle table. Les ensembles de données client n'utilisent pas de nom de table, mais vous devez spécifier la propriété FileName avant d'enregistrer la nouvelle table. Si vous créez une table qui reprend le nom d'une table existante, la table existante et toutes ses données sont remplacées par la nouvelle table. L'ancienne table et ses données ne peuvent pas être récupérées. Pour éviter de remplacer une table existante, vous devez vérifier la propriété Exists à l'exécution. Exists est disponible uniquement sur TTable et TIBTable.
  • Les index de la nouvelle table (facultatif). En conception double-cliquez sur la propriété IndexDefs dans l'inspecteur d'objets pour afficher l'éditeur de collection. Utilisez l'éditeur de collection pour ajouter, supprimer ou modifier les propriétés de définitions d'index. A l'exécution, effacez toutes les définitions d'index existantes et utilisez ensuite la méthode AddIndexDef pour ajouter chaque nouvelle définition d'index. Pour chaque nouvelle définition d'index, définissez les propriétés de l'objet Data.DB.TIndexDef pour spécifier les attributs de l'index.
  • Les champs de la nouvelle table. Pour ce faire, vous pouvez procéder de deux façons :
  • Vous pouvez ajouter des définitions de champs à la propriété FieldDefs. En conception double-cliquez sur la propriété FieldDefs dans l'inspecteur d'objets pour afficher l'éditeur de collection. Utilisez l'éditeur de collection pour ajouter, supprimer ou modifier les propriétés de définitions de champs. A l'exécution, effacez toutes les définitions de champs existantes et utilisez ensuite la méthode AddFieldDef pour ajouter chaque nouvelle définition de champ. Pour chaque nouvelle définition de champ, définissez les propriétés de l'objet Data.DB.TFieldDef pour spécifier les attributs du champ.
  • Vous pouvez utiliser à la place des composants champs persistants. En conception double-cliquez sur l'ensemble de données pour afficher l'éditeur de champs. Dans l'éditeur de champs, cliquez avec le bouton droit et choisissez la commande Nouveau champ. Décrivez les principales propriétés de votre champ. Une fois que le champ est créé, vous pouvez modifier ses propriétés dans l'inspecteur d'objets en le sélectionnant dans l'éditeur de champs.

Remarque :  Vous ne pouvez pas définir d'index pour la nouvelle table si vous utilisez des composants champ persistant au lieu d'objets définition de champ.

Pour créer la table pendant la conception, cliquez avec le bouton droit sur l'ensemble de données et choisissez Créer table (TTable) ou Créer ensemble de données (TClientDataSet). Cette commande n'apparaît pas dans le menu contextuel tant que n'avez pas spécifié toutes les informations nécessaires.

Pour créer la table à l'exécution, appelez la méthode CreateTable (TTable et TIBTable) ou la méthode CreateDataSet (TClientDataSet).

Remarque :  Vous pouvez établir les définitions pendant la conception, puis appeler la méthode CreateTable (ou CreateDataSet) à l'exécution pour créer la table. Cependant, pour faire cela vous devrez indiquer que les définitions spécifiées à l'exécution seront enregistrées avec le composant ensemble de données. (par défaut, les définitions de champs et d'index sont générées de façon dynamique à l'exécution). Spécifiez que les définitions doivent être enregistrées avec l'ensemble de données en définissant sa propriété StoreDefs par True.

Tip: If you are using TTable, you can preload the field definitions and index definitions of an existing table at design time. Set the DatabaseName and TableName properties to specify the existing table. Right click the table component and choose Update Table Definition. This automatically sets the values of the FieldDefs and IndexDefs properties to describe the fields and indexes of the existing table. Next, reset the DatabaseName and TableName to specify the table you want to create, canceling any prompts to rename the existing table.

Remarque :  Quand vous créez des tables Oracle8, vous ne pouvez pas créer de champs objets (champs ADT, champs de tableaux et champs d'ensembles de données).

Le code suivant crée une nouvelle table à l'exécution et l'associe à l'alias DBDEMOS. Avant de créer la nouvelle table, il vérifie que le nom de la table fourni ne correspond pas au nom d'une table existante :

 var
   TableFound: Boolean;
 begin
   with TTable.Create(nil) do // create a temporary TTable component
   begin
     try
       { set properties of the temporary TTable component }
       Active := False;
       DatabaseName := 'DBDEMOS';
       TableName := Edit1.Text;
       TableType := ttDefault;
       { define fields for the new table }
       FieldDefs.Clear;
       with FieldDefs.AddFieldDef do begin
         Name := 'First';
         DataType := ftString;
         Size := 20;
         Required := False;
       end;
       with FieldDefs.AddFieldDef do begin
         Name := 'Second';
         DataType := ftString;
         Size := 30;
         Required := False;
       end;
       { define indexes for the new table }
       IndexDefs.Clear;
       with IndexDefs.AddIndexDef do begin
         Name := '';
         Fields := 'First';
         Options := [ixPrimary];
       end;
       TableFound := Exists; // check whether the table already exists
       if TableFound then
         if MessageDlg('Overwrite existing table ' + Edit1.Text + '?',
              mtConfirmation, mbYesNoCancel, 0) = mrYes then
           TableFound := False;
       if not TableFound then
         CreateTable; // create the table
     finally
       Free; // destroy the temporary TTable when done
     end;
   end;
 end;
 TTable *NewTable = new TTable(Form1);
 NewTable->Active = false;
 NewTable->DatabaseName = "BCDEMOS";
 NewTable->TableName = Edit1->Text;
 NewTable->TableType = ttDefault;
 NewTable->FieldDefs->Clear();
 TFieldDef *NewField = NewTable->FieldDefs->AddFieldDef(); // define first field
 NewField->DataType = ftInteger;
 NewField->Name = Edit2->Text;
 NewField = NewTable->FieldDefs->AddFieldDef(); // define second field
 NewField->DataType = ftString;
 NewField->Size = StrToInt(Edit3->Text);
 NewField->Name = Edit4->Text;
 NewTable->IndexDefs->Clear();
 TIndexDef *NewIndex = NewTable->IndexDefs->AddIndexDef(); // add an index
 NewIndex->Name = "PrimaryIndex";
 NewIndex->Fields = Edit2->Text;
 NewIndex->Options << ixPrimary << ixUnique;
 // Now check for prior existence of this table
 bool CreateIt = (!NewTable->Exists);
 if (!CreateIt)
    if (Application->MessageBox((AnsiString("Overwrite table ") + Edit1->Text +
                                AnsiString("?")).c_str(),
                                "Table Exists", MB_YESNO) == IDYES)
     CreateIt = true;
 if (CreateIt)
   NewTable->CreateTable(); // create the table

Suppression de tables

 CustomersTable.DeleteTable;
 CustomersTable->DeleteTable();

Avertissement :  Quand vous supprimez une table avec DeleteTable, la table et toutes ses données disparaissent.

Si vous utilisez TTable, vous pouvez aussi supprimer des tables pendant la conception : cliquez avec le bouton droit sur le composant table et sélectionnez Supprimer une table dans le menu contextuel. L'option de menu Supprimer une table n'est présente que si le composant table représente une table de base de données existante (les propriétés DatabaseName et TableName spécifient une table existante).

Voir aussi


Exemples de code