Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi DB-Tabelle um Datenfeld erweitern (https://www.delphipraxis.net/104170-db-tabelle-um-datenfeld-erweitern.html)

BrunoT 28. Nov 2007 15:40

Datenbank: Firebird embedded • Zugriff über: Zeos

DB-Tabelle um Datenfeld erweitern
 
Hallo alle zusammen,

Ich beschäftige mich nun endlich mit Firebird als Datenbank, um von Paradox wegzukommen.
Erst mal experimentell.

Ich habe da ein kleines Problem. Ich möchte eine vorhandene Tabelle um eine Spalte(Feld) erweitern.

Da erhalte eine Fehlermeldung:

Code:
SQL Error: unsuccessful metadata update T1. Error Code -607. This operation is not defined for system tables.
Die Fehlermeldung kommt im ALTER Table Statment.

Delphi-Quellcode:

function TForm1.Teste_Feld_In_Tabelle(Bez: string): boolean;
var
  i: Byte;
begin
  result := false;
  with data do
    for i := 0 to ZQuery.FieldDefs.Count - 1 do
      begin
        if Bez = ZQuery.FieldDefs[i].Name then
          Result := True;
      end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  vFirst: Boolean;
begin
  with data do
    begin
      vFirst := False;
      ZConn.User := 'SYSDBA';
      ZConn.Password := 'egal';
      ZConn.Database := '.\TestFb.fdb';
      if not fileExists('.\TestFb.fdb') then
        begin
          vFirst := True;
          ZConn.Properties.Add('CreateNewDatabase=CREATE DATABASE ' +
            QuotedStr('.\TestFb.fdb') + ' USER ' +
            QuotedStr('sysdba') + ' PASSWORD ' + QuotedStr('masterkey') +
            ' PAGE_SIZE 4096 DEFAULT CHARACTER SET ISO8859_1');
        end;
      ZConn.Properties.Add('Dialect=3');
      ZConn.Connected := true;
      if vFirst then
        begin
          ZQuery.SQL.Clear;
          ZQuery.SQL.Add('Create TABLE T1 (P1 INTEGER NOT NULL PRIMARY KEY);');
          ZQuery.ExecSQL;
        end;
      ZQuery.SQL.Add('SELECT P1 FROM T1;');
      ZQuery.Active := True;
      ZQuery.Close;
      ZQuery.SQL.Clear;
      ZQuery.SQL.Add('SELECT * FROM T1;'); //SELECT TOP 0 * FROM T1 ging auch nicht
      ZQuery.open;

//Testen, ob NAME schon vorhanden

      if Teste_Feld_In_Tabelle('Name') = False then
        begin
          ZQuery.SQL.Clear;
          ZQuery.SQL.Add('ALTER TABLE T1 ADD Name Char (30);');
          ZQuery.ExecSQL;
        end;
      ZQuery.SQL.Clear;
      ZQuery.SQL.Add('SELECT * FROM T1 WHERE p1 > 20;');
      ZQuery.open;
      ZQuery.Last;
    end;
end;
Was ist falsch?

mfg

mkinzler 28. Nov 2007 15:46

Re: DB-Tabelle um Datenfeld erweitern
 
Kommt es beim Erzeugen der Tabelle oder später?

BrunoT 28. Nov 2007 15:49

Re: DB-Tabelle um Datenfeld erweitern
 
Hallo mkinzler,

Die Tabelle ist schon da. Ich habe auch ein DBDrid auf der Form und konnte schon Daten eingeben.

Nun hatte ich das Programm um diese Zeilen erweitert:

Delphi-Quellcode:

      if Teste_Feld_In_Tabelle('Name') = False then
        begin
          ZQuery.SQL.Clear;
          ZQuery.SQL.Add('ALTER TABLE T1 ADD Name Char (30);');
          ZQuery.ExecSQL;
        end;
und nun kommt die Fehlermeldung.

mfg

mkinzler 28. Nov 2007 16:06

Re: DB-Tabelle um Datenfeld erweitern
 
Die Tabelle scheint im Zugriff zu sein.

BrunoT 28. Nov 2007 16:09

Re: DB-Tabelle um Datenfeld erweitern
 
Zitat:

Zitat von mkinzler
Die Tabelle scheint im Zugriff zu sein.

wie, ich muss diese schließen? oder das Query.Active auf False setzen?

mfg

mkinzler 28. Nov 2007 16:10

Re: DB-Tabelle um Datenfeld erweitern
 
Der Query muss geschlossen sein.

BrunoT 28. Nov 2007 16:12

Re: DB-Tabelle um Datenfeld erweitern
 
Danke,

ich hab's mir fast gedacht.

mfg

shmia 28. Nov 2007 16:13

Re: DB-Tabelle um Datenfeld erweitern
 
Zitat:

Zitat von mkinzler
Die Tabelle scheint im Zugriff zu sein.

Und ganz gemein ist der Fall, wenn die Query oder Tabelle in der Delphi IDE auf Active = True steht.
Denn dann ist die Tabelle im Zugriff ohne dass man das direkt so merkt.

raiguen 28. Nov 2007 16:27

Re: DB-Tabelle um Datenfeld erweitern
 
Zitat:

Zitat von shmia
Und ganz gemein ist der Fall, wenn die Query oder Tabelle in der Delphi IDE auf Active = True steht.
Denn dann ist die Tabelle im Zugriff ohne dass man das direkt so merkt.

Und deswegen habe ich es mir angewöhnt, NIE und NIMMER irgendwelche DataSets in der IDE zu öffnen rsp. offen zu halten...aber da kommt man erst hinter, wenn einem (zunächst) nicht erklärbare Fehler auf die Augen geknallt werden ;)

mkinzler 28. Nov 2007 16:29

Re: DB-Tabelle um Datenfeld erweitern
 
Zitat:

Und deswegen habe ich es mir angewöhnt, NIE und NIMMER irgendwelche DataSets in der IDE zu öffnen rsp. offen zu halten...aber da kommt man erst hinter, wenn einem (zunächst) nicht erklärbare Fehler auf die Augen geknallt werden Wink
Z.B. wenn das Programm auf anderen Rechnern abschmiert!

Hansa 28. Nov 2007 23:20

Re: DB-Tabelle um Datenfeld erweitern
 
Ja, ist schwierig. Man siehts immer wieder : Änderungen an der DB sollen mit Delphi gemacht werden, anstatt mit einem vernünftigen Admin-Tool. Mit Delphi entwerfe ich die Programme, aber doch nicht das Datenbank-Design. 8)

mkinzler 29. Nov 2007 05:34

Re: DB-Tabelle um Datenfeld erweitern
 
Das Problem ist ja ein Update der Datenbank.

Hansa 29. Nov 2007 08:01

Re: DB-Tabelle um Datenfeld erweitern
 
Unter "Update" der Datenbank versteht man üblicherweise die Änderung des Inhalts der Datenbank und nicht eine Änderung der Daten-Definition ! Letzteres macht man am besten mit in 1 Min. mit IBExpert, anstatt dafür ein Delphi Programm selber zu schreiben. Allerdings sind in dem Vorhaben noch mehr Fehlerquellen zu entdecken : FB embedded braucht exklusiven Zugriff auf die DB. Programm laufen lassen und in der IDE das DBGrid angucken geht nicht. Zeos kann lediglich eine Transaktion steuern. Keine zwei.

RavenIV 29. Nov 2007 08:07

Re: DB-Tabelle um Datenfeld erweitern
 
Zitat:

Zitat von mkinzler
Das Problem ist ja ein Update der Datenbank.

Ich habe auch den Standpunkt, dass eine Änderung an der DB-Struktur nix im eigentlichen Programm verloren hat.
Ausserdem kannst Du die DB nicht umstrukturieren, solange Du darauf zugreifst.

Also würde ich ein kleines Tool schreiben, das die Anpassung macht.
Oder ein SQL-Script, das der Benutzer im IBExpert oder einem anderen DB-Manager ausführen kann.
Oder ein kleines Batch-File, das dieses SQL-Script ausführt.

BrunoT 29. Nov 2007 18:22

Re: DB-Tabelle um Datenfeld erweitern
 
Hallo Ihr,

danke für die Kommentare,

ich habe jetzt alles noch einmal durchgecheckt, es geht noch nicht.

Zur Klarstellung:
Zeoslib 6.6.1 – beta
Protocol firebird-1.5

Ich habe ein Datenmodul mit: TZConnection (ZConn), TZQuery (ZQuery)
Ich habe nichts auf activ gesetzt sondern aktiviere im Programm.
Das DataModul wird vor der Form erstellt.
Auch die Datenbankverbindung wird im Programm hergestellt.
Bei ZQuery ist ZConn als Connection eingestellt sonst nichts.
Das DBGrid und die Datasource ist entfernt.
Ich habe das Programm auch ohne IDE gestartet.

Natürlich würde ich die Änderungen an der Datenbank nicht im eigentlichen Programm machen, sondern in einem separaten Update- Programm.
Mir geht es nur ums Prinzip, warum geht das bei mir nicht und was mache ich falsch. Ich habe auch schon in allen möglichen Foren gesucht, da war der Fehler auch beschrieben, aber die Lösung hat keiner aufgezeigt.

Nur nochmal zum Verständnis für mich:
um die Spalte einzufügen muss ich Zugriff auf die Datenbank haben, also
Delphi-Quellcode:
ZConn.Connected := True;
Ausserdem muss ich einen Query ausführen können, also
Delphi-Quellcode:
 ZQuery.Active := True;
Richtig?
Wenn jemand das Problem schon gelöst hat, dann bitte bitte wie! :firejump: :gruebel:

Sonst bleibe ich bei Paradox! :wall:

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
  vFirst: Boolean;
begin
  with data do
    begin
      vFirst := False;
      ZConn.User := 'SYSDBA';
      ZConn.Password := 'egal';
      ZConn.Database := '.\TestFb.fdb';
      if not fileExists('.\TestFb.fdb') then
        begin
          vFirst := True;
          ZConn.Properties.Add('CreateNewDatabase=CREATE DATABASE ' +
            QuotedStr('.\TestFb.fdb') + ' USER ' +
            QuotedStr('sysdba') + ' PASSWORD ' + QuotedStr('masterkey') +
            ' PAGE_SIZE 4096 DEFAULT CHARACTER SET ISO8859_1');
        end;
      ZConn.Properties.Add('Dialect=3');
      ZConn.Connected := true;
      if vFirst then
        begin
          ZQuery.SQL.Clear;
          ZQuery.SQL.Add('Create TABLE T1 (P1 INTEGER NOT NULL PRIMARY KEY);');
          ZQuery.ExecSQL;
        end;
      ZQuery.SQL.Add('SELECT P1 FROM T1;');
      ZQuery.Active := True;

      //Testen, ob NAME schon vorhanden
      if Teste_Feld_In_Tabelle('Name') = False then
        begin
          ZQuery.SQL.Clear;
          ZQuery.SQL.Add('ALTER TABLE T1 ADD INAME CHAR(30);');
          ZQuery.ExecSQL;
        end;
    end;
end;

DeddyH 29. Nov 2007 18:43

Re: DB-Tabelle um Datenfeld erweitern
 
Klingt vielleicht blöd, aber schau Dir evtl. mal das Tutorial auf dsdt.info an. Außerdem sieht es für mich komisch aus, dass Du bei einer geöffneten Query deren SQL ändern willst.

BrunoT 29. Nov 2007 19:41

Re: DB-Tabelle um Datenfeld erweitern
 
Hi,

Das Tutorial hilft mir nicht weiter. Das liegt ausgedruckt vor mir. Ich habe es schon schräg und quer gelesen. In den Demos ist auch nicht sondelich viel mit SQL-Statements los.

Ich muß also das Query schließen, um die SQL- Anweisung zu ändern?

Nehme ich dafür Query.active:=false; oder Query.close; ?

mfg

mkinzler 29. Nov 2007 19:44

Re: DB-Tabelle um Datenfeld erweitern
 
Zitat:

Ich muß also das Query schließen, um die SQL- Anweisung zu ändern?
Natürlich.
Zitat:

Nehme ich dafür Query.active:=false; oder Query
Nimm .Close, obwohl es eigentlich egal ist.

BrunoT 29. Nov 2007 19:57

Re: DB-Tabelle um Datenfeld erweitern
 
So nun habe ich Close eingefügt.

Immer noch diese blöde Fehlermeldung bei

Delphi-Quellcode:
      if Teste_Feld_In_Tabelle('Name') = False then
        begin
          ZQuery.close;
          ZQuery.SQL.Clear;
          ZQuery.SQL.Add('ALTER TABLE T1 ADD INAME CHAR(30);');
          ZQuery.ExecSQL;
        end;
mfg

Frust macht sich langsam breit :gruebel: :wall: :gruebel:

mkinzler 29. Nov 2007 20:05

Re: DB-Tabelle um Datenfeld erweitern
 
Gibt es weitere DataSets?

BrunoT 29. Nov 2007 20:15

Re: DB-Tabelle um Datenfeld erweitern
 
Nein,

nur ein TZQuery und ein TZConnection.

mfg

mkinzler 29. Nov 2007 20:16

Re: DB-Tabelle um Datenfeld erweitern
 
Es könnte auch eine offene Transaktion sein. Dis- und Reconnecte mal.

BrunoT 29. Nov 2007 20:31

Re: DB-Tabelle um Datenfeld erweitern
 
Liste der Anhänge anzeigen (Anzahl: 1)
Habe ich jetzt eingefügt, geht trotzdem nicht.

ich hänge mal das Projekt an. Eventuell kannst Du mal drüber gucken. Nicht meckern ist nur experimentell;

mfg

BrunoT 3. Dez 2007 08:08

Re: DB-Tabelle um Datenfeld erweitern
 
Hi,

hat schon mal jemand geschaut?

über ein bisschen Hilfe wäre ich dankbar

mfg

Andreas Schilling 3. Dez 2007 09:27

Re: DB-Tabelle um Datenfeld erweitern
 
Ich habe zwar nicht deine DB-Komponenten und konnte es nur mit den IBX und Delphi5 testen. Die Anweisung
Delphi-Quellcode:
if Teste_Feld_In_Tabelle('Name') = False then
begin
  ZQuery.close;
  ZQuery.SQL.Clear;
  ZQuery.SQL.Add('ALTER TABLE T1 ADD INAME CHAR(30);');
  ZQuery.ExecSQL;
end;
führt ohne Fehlermeldung zum Erfolg. Getestet mit embedded version 1.5.3 auf USB-Stick. Wird also an der Komponente liegen. Gibt es keine anderen Komponenten außer der Query? Ich benutze für so etwas gerne die IBScript-Komponente.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:39 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