![]() |
Re: Create Table mit Firebird und ZEOS, wie richtig machen
Zitat:
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 |
Re: Create Table mit Firebird und ZEOS, wie richtig machen
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 |
Re: Create Table mit Firebird und ZEOS, wie richtig machen
Zitat:
|
Re: Create Table mit Firebird und ZEOS, wie richtig machen
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 |
Re: Create Table mit Firebird und ZEOS, wie richtig machen
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. |
Re: Create Table mit Firebird und ZEOS, wie richtig machen
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 |
Re: Create Table mit Firebird und ZEOS, wie richtig machen
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:
@hoika: Danke für den Tip mit der DB-Nummer. Das werde ich aufjedenfall auch so machen.
Mit dieser speziellen TDataSet-Komponente ist es möglich, auf die Metadaten einer Datenbank zuzugreifen, wie z. B. Tabellen, Spalten, Indizes, etc.
Gruß Jens |
Re: Create Table mit Firebird und ZEOS, wie richtig machen
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:
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.
if Qry_DataVersion.RecordCount = 0 then
begin
Delphi-Quellcode:
Ich hoffe das meine Gedanke ansonsten in Ordnung sind. Kommentare erwünscht.
//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. Gruß Jens |
Re: Create Table mit Firebird und ZEOS, wie richtig machen
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 |
Re: Create Table mit Firebird und ZEOS, wie richtig machen
Hallo hoika,
also in einem muss ich Dir leider wiedersprechen. Zitat:
Delphi-Quellcode:
if blablabla.Checked then
// if blablabla.Checked = true then Zitat:
Gruß Jens |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:36 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz