Tabellen erstellen und löschen

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Tabellen-Datenmengen


Bei einigen Tabellen-Datenmengen ist es möglich, die zugrunde liegenden Datenbanktabellen zur Entwurfszeit oder zur Laufzeit zu erstellen bzw. zu löschen. In der Regel werden diese Vorgänge von einem Datenbankverwalter durchgeführt. Bei der Entwicklung und beim Testen der Anwendung ist es unter Umständen sinnvoll, wenn Sie Datenbanktabellen, auf welche die Anwendung zugreifen kann, erstellen und löschen können.

Tabellen erstellen

Sowohl TTable als auch TIBTable ermöglichen das Erstellen von Datenbanktabellen ohne Verwendung von SQL. Gleichfalls lassen sich beim Arbeiten mit Datenmengen vom Typ TClientDataSet Datenmengen erstellen, sofern kein Datenmengen-Provider verwendet wird. Bei Verwendung von TTable und TClientDataSet können Sie zur Entwurfszeit und zur Laufzeit Tabellen erstellen. Beim Einsatz von TIBTable ist die Erstellung von Tabellen nur zur Laufzeit möglich.

Vor dem Erstellen einer Tabelle müssen Sie über Eigenschaften die Struktur der Tabelle festlegen. Hierzu müssen Sie Folgendes angeben:

  • Die Datenbank, zu der die neue Tabelle gehören soll. Bei TTable geben Sie die Datenbank über die Eigenschaft DatabaseName an. Bei TIBTable müssen Sie eine Komponente vom Typ TIBDatabase verwenden, die der Eigenschaft Database zugewiesen wird. (Für Client-Datenmengen wird keine Datenbank verwendet.)
  • Den Datenbanktyp (nur bei TTable). Setzen Sie die Eigenschaft TableType auf den gewünschten Tabellentyp. Für Paradox-, dBASE- oder ASCII-Tabellen muss sie auf ttParadox, ttDBase bzw. ttASCII gesetzt werden. Für alle anderen Tabellentypen setzen Sie die Eigenschaft TableType auf ttDefault.
  • Den Namen der neuen Tabelle. Sowohl für TTable als auch für TIBTable ist die Eigenschaft TableName zur Angabe des Tabellenamens vorgesehen. Für Client-Datenmengen wird kein Tabellenname verwendet, Sie sollten allerdings vor dem Speichern der neuen Tabelle einen Wert für die Eigenschaft FileName festlegen. Wenn Sie für eine Tabelle den Namen einer bereits vorhandenen Tabelle angeben, wird diese samt allen darin enthaltenen Daten durch die neue Tabelle überschrieben. Die alte Tabelle und die darin enthaltenen Daten können nicht wiederhergestellt werden. Um ein unabsichtliches Überschreiben einer vorhandenen Tabelle zu vermeiden, können Sie zur Laufzeit die Eigenschaft Exists prüfen lassen. Sie steht nur für TTable und TIBTable zur Verfügung.
  • Doppelklicken Sie beim Entwerfen der Anwendung im Objektinspektor auf die Eigenschaft IndexDefs, um den einen entsprechenden Editor aufzurufen. Mit diesem Editor können Sie Indexdefinitionen hinzufügen, entfernen oder deren Eigenschaften ändern. Zur Laufzeit müssen Sie alle vorhandenen Indexdefinitionen löschen und die neuen Indexdefinitionen einzeln mit der Methode AddIndexDef hinzufügen. Geben Sie für jede Indexdefinition über die Eigenschaften für das Objekt Data.DB.TIndexDef die gewünschten Indexattribute an.
  • Die Felder der neuen Tabelle. Dazu gibt es zwei Möglichkeiten:
  • Felddefinitionen können in die Eigenschaft FieldDefs eingetragen werden. Doppelklicken Sie beim Entwerfen der Anwendung im Objektinspektor auf die Eigenschaft FieldDefs, um den einen entsprechenden Editor aufzurufen. Mit diesem Editor können Sie Felddefinitionen hinzufügen, entfernen oder deren Eigenschaften ändern. Zur Laufzeit müssen Sie alle vorhandenen Felddefinitionen löschen und die neuen Felddefinitionen einzeln mit der Methode AddFieldDef hinzufügen. Geben Sie für jede neue Felddefinition über die Eigenschaften des Objekts Data.DB.TFieldDef die gewünschten Feldattribute an.
  • Doppelklicken Sie beim Entwurf der Anwendung auf die Datenmenge, um den Felder-Editor aufzurufen. Klicken Sie im Felder-Editor mit der rechten Maustaste und wählen Sie den Befehl Neues Feld aus. Geben Sie die grundlegenden Eigenschaften des Feldes an. Nachdem das Feld erstellt worden ist, können Sie seine Eigenschaften im Objektinspektor ändern, indem Sie das Feld im Felder-Editor markieren.

Hinweis: Es ist nicht möglich, Indizes für die neue Tabelle zu definieren, wenn Sie persistente Feldkomponenten statt Objekte zur Felddefinition verwenden.

Klicken Sie zum Erstellen der Tabelle zur Entwurfszeit mit der rechten Maustaste auf die Datenmenge, und wählen Sie den Befehl Tabelle erstellen (TTable) bzw. DataSet erstellen (TClientDataSet) Dieser Befehl ist erst dann im lokalen Menü verfügbar, wenn Sie alle erforderlichen Angaben gemacht haben.

Rufen Sie zum Erstellen der Tabelle zur Laufzeit eine der Methoden CreateTable (TTable bzw. TIBTable) oder CreateDataSet (TClientDataSet) auf.

Hinweis: Es ist auch möglich, die Definitionen zur Entwurfszeit der Anwendung festzulegen und dann zur Laufzeit die Methode CreateTable (bzw. CreateDataSet) aufzurufen, um die Tabelle zu erstellen. Hierzu müssen Sie allerdings festlegen, dass die zur Laufzeit angegebenen Definitionen zusammen mit der Datenmengenkomponente gespeichert werden sollen. (Per Voreinstellung werden Feld- und Indexdefinitionen zur Laufzeit dynamisch generiert.) Setzen Sie hierzu die Eigenschaft StoreDefs der Komponente auf True.

Tipp: Bei Verwendung von TTable können Sie die Feld- und Indexdefinitionen einer bereits vorhandenen Tabelle zur Entwurfszeit im voraus laden. Setzen Sie dazu die Eigenschaften DatabaseName und TableName auf die vorhandene Tabelle. Klicken Sie mit der rechten Maustaste auf die Tabellenkomponente, und wählen Sie Tabellendefinition aktualisieren. Dies bewirkt, dass die Werte der Eigenschaften FieldDefs und IndexDefs automatisch so eingestellt werden, dass sie die Felder und Indizes der vorhandenen Tabelle beschreiben. Setzen Sie anschließend die Eigenschaften DatabaseName und TableName auf die Werte für die zu erstellende Tabelle und verneinen Sie alle Aufforderungen, die vorhandene Tabelle umzubenennen.

Hinweis: Beachten Sie, dass Sie beim Erstellen von Oracle8-Tabellen keine Objektfelder (ADT-Felder, Array-Felder und Datenmengen-Felder) definieren können.

Mit dem folgenden Beispielquelltext wird zur Laufzeit eine Tabelle erstellt und mit dem Aliasnamen DBDEMOS verknüpft. Zuvor wird geprüft, ob der angegebene Tabellenname nicht bereits vorhanden ist:

 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

Tabellen löschen

Die Datentypen TTable und TIBTable ermöglichen das Löschen von Tabellen aus der zugrunde liegenden Datenbank, ohne dass hierzu SQL-Quelltext benötigt wird. Zum Löschen einer Tabelle zur Laufzeit müssen Sie die Methode DeleteTable für die Datenmenge aufrufen. Beispiel: Mit der folgenden Anweisung wird die einer Datenmenge zugrunde liegende Tabelle gelöscht:

 CustomersTable.DeleteTable;
 CustomersTable->DeleteTable();

Warnung:  Bei Verwendung von DeleteTable werden die Tabelle und mit ihr alle Daten unwiederbringlich gelöscht.

Wenn Sie mit TTable arbeiten, ist auch das Löschen von Tabellen beim Entwurf der Anwendung möglich: Klicken Sie mit der rechten Maustaste auf die Tabellenkomponente und wählen Sie im lokalen Menü den Befehl Tabelle löschen. Dieser Befehl ist im lokalen Menü nur dann verfügbar, wenn die Tabellenkomponente eine bereits vorhandene Datenbanktabelle darstellt (d.h. in den Eigenschaften DatabaseName und TableName wird eine vorhandene Tabelle angegeben).

Siehe auch


Codebeispiele