AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Create Table mit Firebird und ZEOS, wie richtig machen
Thema durchsuchen
Ansicht
Themen-Optionen

Create Table mit Firebird und ZEOS, wie richtig machen

Ein Thema von Jens Hartmann · begonnen am 26. Jan 2010 · letzter Beitrag vom 11. Feb 2010
Antwort Antwort
Seite 3 von 4     123 4      
Benutzerbild von Jens Hartmann
Jens Hartmann

Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
 
Delphi XE2 Professional
 
#21

Re: Create Table mit Firebird und ZEOS, wie richtig machen

  Alt 27. Jan 2010, 11:03
Zitat von hoika:
Was ich nicht verstehe ist, dass du einen haufen Zeit mit Create Table verwendest,
ohne eine Zeile "richtigen" Code geschrieben zu haben.
Falls sich in der Tabelle noch etwas ändern sollte,
fängst du wieder an.

Schnapp dir IBExpert, lege dort komfortabel die Tabellen an
und wenn du mit dem Programm fertig bist,
kannst du dir immer noch überlegen, wie du die DB erzeugst / auslieferst.
Das ist doch alles kein Problem mehr für mich. So mache ich es ja bislang. Es ist nur so, das sich meine Software weiterentwickelt hat, und ich um zusätzliche Tabellen und Einträge in die Datenbank nicht mehr umher komme.
Bislang habe ich die Datenbank bei der Auslieferung fertig Konfiguriert mit Ausgeliefert und dann beim Kunden an dessen Einstellungen angepasst.
Da ich aber jetzt zusätzliche Tabellen und Einträge in die Datenbank integriert habe, muss ich ja einen Weg finden, diese auch bei meinen vorhandenen Kunden zu integrieren. Und da ist mir halt der Gedanke gekommen, dies auf diesem Weg zu machen.
Ich würde ein Software-Update ausliefern, dieses Installieren und anschließend in den neuen Menüfunktionen beim Konfigurieren in die DB schauen, und bei nicht vorhanden (alte Software) diese einfach erzeugen lassen.
Somit gehe ich doch dem Problem aus dem Weg, die vorhanden Kundenspezifische Konfiguration erneut durchführen zu müssen. Würde ich die DB gegen die neue austauschen, wären ja auch dessen Einstellungen weg.

Gruß Jens
Jens Hartmann
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#22

Re: Create Table mit Firebird und ZEOS, wie richtig machen

  Alt 27. Jan 2010, 11:49
Hallo,

ahhh so

Dann ist das OK.

In der Praxis hat sich bei mir bewährt,
in der DB eine DB-Nummer hochzuzählen.

Anhand der DB-Nummer weiss
1. das Programm, welche Tabellen/Felder vorhanden sind
2. die DB-Update-Routine, was noch zu aktualisieren ist

Die Nummer steht in einer eigenen Tabelle
DBInfo
DBNo Integer

Da das Aktualisieren und das Hochsetzen der DB-Nummer
in einer gemeinsamen Transaktion erfolgt, kann nichts schiefgehen.


Heiko
Heiko
  Mit Zitat antworten Zitat
schlecki

Registriert seit: 11. Apr 2005
Ort: Darmstadt
148 Beiträge
 
Delphi XE2 Enterprise
 
#23

Re: Create Table mit Firebird und ZEOS, wie richtig machen

  Alt 27. Jan 2010, 12:27
Zitat von hoika:
Da das Aktualisieren und das Hochsetzen der DB-Nummer
in einer gemeinsamen Transaktion erfolgt, kann nichts schiefgehen.
Heiko
Zumindest beim Firebird - ich glaube auch bei den anderen großen DBMS - läuft die DDL (Data Definition Language) nicht in einer Transaktion!
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#24

Re: Create Table mit Firebird und ZEOS, wie richtig machen

  Alt 27. Jan 2010, 12:32
Hallo,

das glaube ich nicht.

Was du vielleicht meinst sind die Generatoren(Sequenzen),
ein gen_id(gen_x,1) ist in der Tat per Rollback nicht rückgängig machbar.

StartTransaction
Create Table Tab_X
RollBack

=> Tab_X existiert nicht.

Auch die Metadaten sind Teile der MGA.


Heiko
Heiko
  Mit Zitat antworten Zitat
schlecki

Registriert seit: 11. Apr 2005
Ort: Darmstadt
148 Beiträge
 
Delphi XE2 Enterprise
 
#25

Re: Create Table mit Firebird und ZEOS, wie richtig machen

  Alt 27. Jan 2010, 12:48
hm, ist das neu?

Ich meine mich erinnern zu können, etwas ähnliches wie du verwenden zu wollen und es scheiterte genau an dieser Stelle. Wobei das auch schon eine Weile her ist.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#26

Re: Create Table mit Firebird und ZEOS, wie richtig machen

  Alt 27. Jan 2010, 13:14
Hallo,

also zumindestens ein Alter Table Add kann ich per RollBack wieder "zurücksetzen".
Das sollte bei Create Table aber auch so sein.

Kommt auf einen Versuch an ...


Heiko
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von Jens Hartmann
Jens Hartmann

Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
 
Delphi XE2 Professional
 
#27

Re: Create Table mit Firebird und ZEOS, wie richtig machen

  Alt 27. Jan 2010, 14:12
Danke erstmal für die viele Hilfe,

kann mir vieleicht mal jemand was zu der Metadaten Komponente sagen. Oder gibt es da irgendwo eine Beschreibung oder ein Tutorial zu. Ich möchte mir die Kompo gerne mal genauer ansehen. Allerdings kann ich in folgendem Tutorial...



leider nur das hier finden..
Code:
Mit dieser speziellen TDataSet-Komponente ist es möglich, auf die Metadaten einer Datenbank zuzugreifen, wie z. B. Tabellen, Spalten, Indizes, etc.
@hoika: Danke für den Tip mit der DB-Nummer. Das werde ich aufjedenfall auch so machen.

Gruß Jens
Jens Hartmann
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  Mit Zitat antworten Zitat
Benutzerbild von Jens Hartmann
Jens Hartmann

Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
 
Delphi XE2 Professional
 
#28

Re: Create Table mit Firebird und ZEOS, wie richtig machen

  Alt 28. Jan 2010, 18:36
Hallo zusammen,

ich habe jetzt mal versucht das ganze umzusetzen. Es funktioniert auch so wie ich mir das Vorgestellt habe. Allerdings frage ich nach dem Abfragen ob die DB "DBINFO" existiert mit
Delphi-Quellcode:
  if Qry_DataVersion.RecordCount = 0 then
    begin
ab, ob die DB existiert. Und ich vermute das es nicht der Richtige weg ist. Hier mal meine Funtkion mit der DB-Version, wie "hoika" vorgeschlagen hat.
Delphi-Quellcode:
//Anweisung in Form.Create von Form1
  if DM_Update.DatenbankVersion(Vers) = true then
    begin
    ...
//Neues Unit DataManagement. Soll die komplette Verwaltung der Datenbank in Zukunft übernehmen
unit DataManagement;

interface

uses
  SysUtils, Classes, ZConnection, DB, ZAbstractRODataset, ZAbstractDataset,
  ZDataset, Dialogs;

type
  TDM_Update = class(TDataModule)
    Con_UpdateConfig: TZConnection;
    Con_UpdateSecurdat: TZConnection;
    Con_UpdateUser: TZConnection;
    Qry_DataVersion: TZQuery;
    Qry_UpdateVersion: TZQuery;
  private
    { Private-Deklarationen }
  public
    function DatenbankVersion(var Version : Integer) : Boolean;
    function UpdateVersion(var Version : Integer) : Boolean;
    function UpdateDataDB(var Version : Integer) : Boolean;
    function UpdateUserDB(var Version : Integer) : Boolean;
    { Public-Deklarationen }
  end;
var
  DM_Update: TDM_Update;

implementation
uses
Alarm;

{$R *.dfm}
function TDM_Update.DatenbankVersion(var Version : Integer) : Boolean;
var
  CurrentVersion : integer;
begin
DatenbankVersion := true;
  try
    Qry_DataVersion.SQL.Text :=
      'SELECT 1 FROM rdb$relations where rdb$relation_name = :TableName';
    Qry_DataVersion.ParamByName('TableName').AsString:= 'DBINFO';
    Qry_DataVersion.Open;

    if Qry_DataVersion.RecordCount = 0 then
      begin
        Qry_DataVersion.Close;
        Qry_DataVersion.SQL.Text :=
          'CREATE GENERATOR GEN_DBINFO_ID; ';
        Qry_DataVersion.ExecSQL;
        DM_Update.Con_UpdateConfig.Commit;
        Qry_DataVersion.SQL.Text :=
          'CREATE TABLE DBINFO (ID_INFO ID_DOM, VERSION NUMMER_DOM)';
        Qry_DataVersion.ExecSQL;
        DM_Update.Con_UpdateConfig.Commit;
        Qry_DataVersion.SQL.Text :=
          'ALTER TABLE DBINFO ADD CONSTRAINT PK_DBINFO PRIMARY KEY (ID_INFO) USING INDEX ID_INFO';
        Qry_DataVersion.ExecSQL;
        DM_Update.Con_UpdateConfig.Commit;
        Qry_DataVersion.SQL.Text :=
          'CREATE OR ALTER TRIGGER TRI_DBINFO FOR DBINFO ACTIVE BEFORE INSERT POSITION 0 '+
          'AS BEGIN '+
          'IF (NEW.ID_INFO IS NULL) THEN '+
          'NEW.ID_INFO = GEN_ID(GEN_DBINFO_ID,1);END';
        Qry_DataVersion.ExecSQL;
        DM_Update.Con_UpdateConfig.Commit;

        Qry_DataVersion.Close;
        Qry_DataVersion.SQL.Text :=
          'INSERT INTO DBINFO (VERSION)VALUES(:Bereich)';
        Qry_DataVersion.ParamByName('Bereich').Value := 1;
        Qry_DataVersion.ExecSQL;
        DM_Update.Con_UpdateConfig.Commit;
      end
    else
      begin
        CurrentVersion := 2;//Wert kann je nach Softwareversion der DB angepasst werden
        Qry_DataVersion.SQL.Text :=
          'SELECT * FROM DBINFO';
        Qry_DataVersion.Open;
        if Qry_DataVersion.FieldByName('Version').AsInteger <> CurrentVersion then
          begin
            if UpdateVersion(CurrentVersion) = true then
              begin
                Form1.ServiceMemo.Lines.Add('Datenbankupdate auf Version '+IntToStr(CurrentVersion)+
                                            ' erfolgreich durchgeführt!');
                Version := CurrentVersion;
              end
          end
        else
          Version := CurrentVersion;
      end;
  except
    DatenbankVersion := false;
  end;
end;

function TDM_Update.UpdateVersion(var Version : Integer) : Boolean;
begin
UpdateVersion := true;
  try
    Qry_UpdateVersion.SQL.Text :=
      'UPDATE DBINFO SET VERSION = :Version WHERE ID_INFO =:Id';
    Qry_UpdateVersion.ParamByName('Version').Value := Version;
    Qry_UpdateVersion.ParamByName('Id').Value := 1;
    Qry_UpdateVersion.ExecSQL;
    Con_UpdateConfig.Commit;
    case Version of
    1: begin
         UpdateDataDB(Version);//in die Case Anweisungen je nach Notwendigkeit
         UpdateUserDB(Version);
       end;
    2: begin
         UpdateDataDB(Version);//in die Case Anweisungen je nach Notwendigkeit
       end;
    end;
  except
    UpdateVersion := false;
  end;
end;

function TDM_Update.UpdateDataDB(var Version : Integer) : Boolean;
begin
  //Update der Datenbank Data
end;

function TDM_Update.UpdateUserDB(var Version : Integer) : Boolean;
begin
  //Update der Datenbank User
end;

end.
Ich hoffe das meine Gedanke ansonsten in Ordnung sind. Kommentare erwünscht.

Gruß Jens
Jens Hartmann
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#29

Re: Create Table mit Firebird und ZEOS, wie richtig machen

  Alt 28. Jan 2010, 19:46
Hallo,

SELECT 1 FROM rdb$relations where rdb$relation_name = :TableName

if Qry_DataVersion.RecordCount = 0

Das passt nicht !!!

Prinzipiell nie !! auf RecordCount prüfen ...

Existiert die Tabelle, wird 1 zurückgegeben -> RecordCount=1
Existiert die Tabelle nicht, wird NULL zurückgegeben -> RecordCount=1


Du musst auf nach dem Open auf Qry_DataVersion.Fields[0].AsString='1' prüfen !


Ausserdem fehlt ein Transaktions-Management,
sonst kann es passieren, die Tabelle existiert,
aber der Generator nicht.

DB.StartTransaction
try
finally
end;


Heiko
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von Jens Hartmann
Jens Hartmann

Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
 
Delphi XE2 Professional
 
#30

Re: Create Table mit Firebird und ZEOS, wie richtig machen

  Alt 4. Feb 2010, 07:03
Hallo hoika,

also in einem muss ich Dir leider wiedersprechen.
Zitat von hoika:
Prinzipiell nie !! auf RecordCount prüfen ...

Existiert die Tabelle, wird 1 zurückgegeben -> RecordCount=1
Existiert die Tabelle nicht, wird NULL zurückgegeben -> RecordCount=1
Das ist nicht ganz richtig. Wenn die Tabelle nicht vorhanden ist, gibt mir Delphi ein RecordCount = 0 zurück. Ein RecordCount 1 bekomme ich nur, wenn die Tabelle bereits existiert. Also wüsste ich momentan nicht, warum das nicht funktionieren sollte. Es geht ja auch bei mir. Hat das vieleicht auch so einen Grund wie die Abfrage auf...
Delphi-Quellcode:
  if blablabla.Checked then
//
if blablabla.Checked = true then
Zitat von hoika:
DB.StartTransaction
try
finally
end;
Das werde ich aufjedenfall noch einfügen. Wobei ich momentan am überlegen bin, ob ich nicht vieleicht grade ein kleines Update Tool schreiben sollte, was unabhängig von meinem eigendlichen Programm ist.

Gruß Jens
Jens Hartmann
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 4     123 4      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:31 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