Erweiterung einer bestehenden Datenbank



  • Hallo,

    kann mir jemand weiterhelfen? 😕
    Ich möchte an eine bereits vorhandene Datenbank neue Felder hinzufügen.
    Als erstes prüfe ich mit Table->FindField("Name") ob es das Feld bereits gibt.
    Wenn es das Feld nicht gibt möchte ich es gern hinzufügen. Leider gestaltet sich das schwieriger als gedacht.

    Mein Versuch sah so aus:
    Table->DatabaseName = Verzeichnis;
    Feld = Table->FindField("Counter");
    if (Feld->FieldNo != 48){
    TFieldDef *pNewDef = Table->FieldDefs->AddFieldDef();
    pNewDef->Name = "Counter";
    pNewDef->DataType = ftSmallint;
    pNewDef->Required = false;}
    Table->Active = true;

    Hier erhalte ich ständig die Meldung, daß das Feld bereits vorhanden ist, das stimmt aber nicht. 😡

    Kann es sein, das ich diese Methode nur bei einer neuen Tabelle verwenden kann, oder mache ich etwas falsch?



  • versuch mal mit Hilfe von SGL neue Felder einzubauen, über TTable ist das etwas schwierig

    am besten erst abfragen ob das Feld vorhanden ist und dann mit Query das Feld hinzufügen, der SQL-Str ist folgender:

    ALTER TABLE deine-tabelle
    (
    ADD neues-feld feldtyp )
    

    bei "feldtyp" mußt du natürlich deinen gewünschten Typ angeben (z.B. Varchar(50), Integer, Float)



  • Um einen SQL-String an die DB zu senden, muss die Table doch aktiv sein, oder nicht?
    Genau das Öffen der DB gelingt mir nicht, weil in der DB diese Felder fehlen.

    In dem TTable Objekt sind bereits diese Felder vorhanden.
    Jetzt möchte ich aber eine alte DB aufrufen in der diese Felder, die ich im TTable-Objekt definiert habe fehlen.

    Vor dem 'aktiv setzen' der Table prüfe ich ob die neu hinzugekommenden DB-Felder in der DB vorhanden sind. Wenn nicht wollte ich die neuen Felder in die alte DB einfügen und sie dann öffnen.



  • die Datenbank muß aktiv sein, die Tabelle nicht

    mit was für einer Datenbank arbeitest du eigentlich?



  • Ich arbeite mit Paradox-Datenbanken.

    Wie kann denn die DB aktiv sein und die Table nicht?
    Ich war bisher der Meinung, ich aktiviere die DB indem ich vom TTable-Objekt die Eigenschaft Active = true setze (nachdem ich DatabaseName einen Wert zugewiesen habe). Die Eigenschaft TableName bleibt immer gleich (nur das Verzeichnis der DB ändert sich). In der Eigenschaft FieldDefs befinden sich meine DB-Felder. Wenn ich nun eine alte DB öffne erhalte ich eine Exception der Klasse EDatabaseError und es wird mir gesagt welches Feld in der DB fehlt.

    Ach so ich arbeite ohne DB-Alias.



  • na, da mistet jemand seine Datenbanken aus.
    Tip: Wenn man eh schon mal dabei ist, soote man auf SQL_Server umsetellen. Alles andere ist pure Zeitverschwendung 🙂

    Falls du den Rat nicht befolgen möchtest: Ich glaube, dass du mit einer manuellen Änderung schneller vorankommst. Auch wenn es mehrere Tabellen sind. Ist ein wenig Fleißarbeit aber dafür hast du auch eine bessere Kontolle.



  • andere Möglichkeiten:

    eine neues TTable-Objekt erzeugen, Datenbank und Tabellenname zuweisen, aber keine Felder und dann die neuen Felder mit einem Query einbauen

    oder gleich nur ein Query nehmen, wenn du weißt welche Felder neu hinzu kommen sollen, da man auch dem Query die Datenbank zuweisen kann

    im Endeffekt mußt du nur ein Objekt haben, welches nicht zwingend auf die Feldstruktur zugreift



  • Wenn ich erst zur Laufzeit die Felder hinzufüge, kann ich aber doch im Design-Modus nicht auf die Felder zugreifen. Hier würde doch der Compiler ständig Fehlermeldungen bringen.

    Den Zugriff auf die Datenbank realisiere ich wie folgt:
    Table1->Edit();
    Table1->FeldCounter->value = x;
    Table1->Post();

    An einigen Stellen im Programm arbeite ich mit SQL-Abfragen, wobei die Antwort im Query zurückgeliefert wird. An anderer Stelle lege ich nur einen Filter auf die DB. Das soll heißen, das Query ist nicht ständig mit der DB verbunden und ich muss die Felder in der Table im Design-Mod definieren.

    Langsam beschleicht mich das Gefühl, das meine Art u. Weise eine DB-Anwendung zu programmieren nicht gans korrekt ist. 😞

    Mit SQL-Server habe ich noch nie gearbeitet.


  • Mod

    Hallo

    das beste ist du verwendest (in Zukunft) nur noch Querya
    alles andere ist veraltet und eigentlich schon tod
    dein Problem laesst sich dadurch eigentlich auch loesen

    direkt nach Verbindungsaufnahme mit der DB (hoffentlich nicht BDE)
    einen Query an die Tabelle senden (Abfrage ob Feld vorhanden)
    wenn das Feld nicht vorhanden ist -> Query (....) neues Feld anlegen

    MfG
    Klaus



  • Wie erfolgt denn die Verbindungsaufnahme zur DB wenn nicht über ein TTable Objekt.

    Habe ich das richtig verstanden:
    In Table alle Felder in FieldDefs löschen und in Query zur Laufzeit anlegen nachdem ich die DB nach ihren vorhandenen Feldern befragt habe? Wie habe ich dann aber im Design-Modus einen Zugriff auf die DB-Felder?


  • Mod

    Hallo

    zB AdoConnection (ADO)
    (die BDE sollte man nicht mehr verwenden - gab schon sehr viele Posts dazu)

    MfG
    Klaus



  • Steffan schrieb:

    Wie erfolgt denn die Verbindungsaufnahme zur DB wenn nicht über ein TTable Objekt.

    das TQuery-Objekt hat die gleiche Eigenschaft DatabaseName wie das TTable-Objekt, außerdem gibts noch eine Komponente namens TDatabase

    wenn das Einfügen neuer Felder nur eine einmalige Aktion ist, kannst du auch ein kleines separates Programm schreiben, da brauchst du keine Felder im Design-Modus anzulegen,

    wobei ich das mit dem Design-Modus-Felder-anlegen persönlich sehr undynamisch finde

    Hinweis: die ADO-Komponenten sind erst ab C++ Builder 6 standardmäßig dabei


Log in to reply