Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Datenbank-Update zur Laufzeit (https://www.delphipraxis.net/187337-datenbank-update-zur-laufzeit.html)

HPB 20. Nov 2015 10:51

Datenbank: Interbase • Version: XE2 • Zugriff über: IB

Datenbank-Update zur Laufzeit
 
Liste der Anhänge anzeigen (Anzahl: 1)
Guten Tag Delphianer,
ich habe die verschiedenen Themen zu einem Datenbankupdate die hier im Forum stehen
gelesen. Es ist aber alles nicht das was ich suche.
Folgende Situation:
Ich möchte einige Tabellen in einer Interbase-Datenbank zur Laufzeit updaten,
oder auch Felder zu Tabellen hinzufügen.
Vorher prüfe ich ob eine Update nötig ist. Das ist alles klar.

Um was es mir geht ist folgendes:
Wenn ich ein Update ausführen möchte, muss ich ja die Datenbank öffnen.
Wenn die DB geschlossen ist, kann ich nicht auf die Transaction zugreifen usw.
Beim User sind aber die Änderungen in der DB noch nicht bekannt.
Ein öffnen führt also zu einer Fehlermeldung (siehe Anhang, das Feld soll
erst hinzugefügt werden).

Das Update wird von einem SQL-Scipt Ausgeführt.
Um die Änderung in die Datenbank zu übernehmen wird eine Transaction geöffnet
und hinterher mit Commit geschlossen.

Hier ein klein wenig Code:
Delphi-Quellcode:
procedure TOLogenUpdate2420.NeueTabelleMatrikelNr;
begin
  try
    dtmdMain.DoStartTransaction;
    FMSQL.Close;
    FMSQL.SQL.Clear;
    FMSQL.SQL.Add('create table matrikelnummern (');
    FMSQL.SQL.Add('matrikelnr integer not null ) ');
    FMSQL.Prepare;
    FMSQL.ExecQuery;

    FMSQL.Close;
    FMSQL.SQL.Clear;
    FMSQL.SQL.Add('alter table matrikelnummern add primary key (matrikelnr)');
    FMSQL.Prepare;
    FMSQL.ExecQuery;
  finally
    dtmdMain.ibtrnsctnLoge.Commit;
  end;
end;
Dazu die Transaction aus der Datenbank:
Delphi-Quellcode:
procedure TdtmdMain.DoStartTransaction;
begin
  if not ibtrnsctnLoge.InTransaction then ibtrnsctnLoge.StartTransaction;
end;
Wie kann die Fehlermeldung umgangen werden????
Ich möchte nicht jedesmal die gesamte DB-Struktur und die enthaltenen Daten exportieren.
Das ist keine Option, in manchen Tabellen stehen tausende von Datensätze.
Welchen Weg gibt es noch um ein Update durchzuführen?

Die Fehlermeldung ist im Anhang beigefügt.

Wenn Vorschläge, dann bitte mit Beispiel.

Mit Gruß HPB

arnof 20. Nov 2015 10:56

AW: Datenbank-Update zur Laufzeit
 
Fehlermeldung ist doch eindeutig: das Feld gibts nicht ....

Neutral General 20. Nov 2015 10:57

AW: Datenbank-Update zur Laufzeit
 
Naja einmal sollten keine (anderen) User zur Datenbank verbunden sein wenn du das Update ausführst.
Zum anderen musst du je nachdem was du an den Strukturen änderst natürlich auch den Code des Clients ändern.
Da kommst du ja ohne weiteres nicht drum rum. Woher soll das Programm auch wissen dass es neue Felder gibt und vor allem ob und wie es diese benutzen soll.

HPB 20. Nov 2015 11:02

AW: Datenbank-Update zur Laufzeit
 
Zitat:

Zitat von Neutral General (Beitrag 1321993)
Naja einmal sollten keine (anderen) User zur Datenbank verbunden sein wenn du das Update ausführst.
Zum anderen musst du je nachdem was du an den Strukturen änderst natürlich auch den Code des Clients ändern.
Da kommst du ja ohne weiteres nicht drum rum. Woher soll das Programm auch wissen dass es neue Felder gibt und vor allem ob und wie es diese benutzen soll.

Danke für Deine Antwort,
ich habe den Fehler gefunden. Es stand noch etwas von einem ur, uralten Quellcode in der Unit.
Die Datenbank kann selbstverständlich geöffnet werden. Die Tabellen dürfen erst geöffnet werden,
wenn das Update gelaufen ist. Da hast Du ganz recht.
Nun da der Quellcode berichtigt ist, läuft auch alles wie gewünscht.
Mit Gruß HPB


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:16 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz