Afficher : Delphi C++
Préférences d'affichage

Création et suppression des tables

De RAD Studio XE2

Remonter à Présentation des ensembles de données - Index

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.
Conseil :  Si vous utilisez TTable, vous pouvez pré-charger les définitions de champs et d'index d'une table existante pendant la conception. Définissez les propriétés DatabaseName et TableName pour spécifier la table existante. Cliquez avec le bouton droit sur le composant table et choisissez Mettre à jour la définition de table. Cela définit automatiquement les valeurs des propriétés FieldDefs et IndexDefs pour décrire les champs et les index de la table existante. Ensuite, réinitialisez DatabaseName et TableName pour spécifier la table que vous voulez créer, en annulant toutes les demandes de renommer la table existante.
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 // crée un composant TTable temporaire
  begin
    try
      { définit les propriétés du composant TTable temporaire }
      Active := False;
      DatabaseName := 'DBDEMOS';
      TableName := Edit1.Text;
      TableType := ttDefault;
      { définit les champs de la nouvelle 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;
      { définit les index de la nouvelle table }
      IndexDefs.Clear;
      with IndexDefs.AddIndexDef do begin
        Name := ;
        Fields := 'First';
        Options := [ixPrimary];
      end;
      TableFound := Exists; // vérifie si la table existe déjà
      if TableFound then
        if MessageDlg('Remplacer la table existante ' + Edit1.Text + ' ?',
             mtConfirmation, mbYesNoCancel, 0) = mrYes then
          TableFound := False;
      if not TableFound then
        CreateTable; // crée la table
    finally
      Free; // détruit le composant TTable temporaire à la fin
    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(); // définit le premier champ
NewField->DataType = ftInteger;
NewField->Name = Edit2->Text;
NewField = NewTable->FieldDefs->AddFieldDef(); // définit un deuxième champ
NewField->DataType = ftString;
NewField->Size = StrToInt(Edit3->Text);
NewField->Name = Edit4->Text;
NewTable->IndexDefs->Clear();
TIndexDef *NewIndex = NewTable->IndexDefs->AddIndexDef(); // ajoute un index
NewIndex->Name = "PrimaryIndex";
NewIndex->Fields = Edit2->Text;
NewIndex->Options << ixPrimary << ixUnique;
// Vérifie maintenant l'existence préalable de cette 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(); // crée la table


Suppression de tables

TTable et TIBTable vous permettent de supprimer des tables de la base de données sous-jacente sans utiliser SQL. Pour supprimer une table à l'exécution, appelez la méthode DeleteTable de l'ensemble de données. Par exemple, l'instruction suivante supprime la table sous-jacente d'un ensemble de données :

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

Versions précédentes
Autres langues