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.

Anmerkung:  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.

Anmerkung:  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.

Tip:  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.

Anmerkung:  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 // Temporäre TTable-Komponente erstellen
  begin
    try
      { Eigenschaften der temporären TTable-Komponente festlegen }
      Active := False;
      DatabaseName := 'DBDEMOS';
      TableName := Edit1.Text;
      TableType := ttDefault;
      { Felder der neuen Tabelle definieren }
      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;
      { Indizes der neuen Tabelle definieren }
      IndexDefs.Clear;
      with IndexDefs.AddIndexDef do begin
        Name := ;
        Fields := 'First';
        Options := [ixPrimary];
      end;
      TableFound := Exists; // Prüfen, ob die Tabelle bereits existiert
      if TableFound then
        if MessageDlg('Overwrite existing table ' + Edit1.Text + '?',
             mtConfirmation, mbYesNoCancel, 0) = mrYes then
          TableFound := False;
      if not TableFound then
        CreateTable; // Tabelle erzeugen
    finally
      Free; // Temporäre TTable-Komponente löschen
    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(); // erstes Feld definieren
NewField->DataType = ftInteger;
NewField->Name = Edit2->Text;
NewField = NewTable->FieldDefs->AddFieldDef(); // zweites Feld definieren
NewField->DataType = ftString;
NewField->Size = StrToInt(Edit3->Text);
NewField->Name = Edit4->Text;
NewTable->IndexDefs->Clear();
TIndexDef *NewIndex = NewTable->IndexDefs->AddIndexDef(); // Index hinzufügen
NewIndex->Name = "PrimaryIndex";
NewIndex->Fields = Edit2->Text;
NewIndex->Options << ixPrimary << ixUnique;
// Jetzt überprüfen, ob diese Tabelle bereits vorhanden war
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(); // Tabelle erstellen

Tabellen löschen

Die Datenmengentypen 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