Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Firebird CreateTable Fehlermeldung (https://www.delphipraxis.net/183738-firebird-createtable-fehlermeldung.html)

strom 1. Feb 2015 13:12

Datenbank: Firebird • Version: 2.5 • Zugriff über: IBC

Firebird CreateTable Fehlermeldung
 
Hallo,

die Table wird in der Database nicht angelegt!

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
 if FileExists(ExtractFilePath(Application.ExeName)+'ELP.fdb') then
  begin
   //IBCTable1.TableName := 'EINSATZ';
   //IBCTAble1.Active := true;
  end else
begin
  IBCConnection1.Database := ExtractFilePath(Application.ExeName)+'ELP.fdb';
  IBCConnection1.Params.Clear;
  IBCConnection1.Params.Add('USER ''SYSDBA''');
  IBCConnection1.Params.Add('PASSWORD ''masterkey''');
  IBCConnection1.Params.Add('PAGE_SIZE 4096');
  IBCConnection1.Params.Add('DEFAULT CHARACTER SET WIN1250');
  IBCConnection1.CreateDatabase;
  IBCConnection1.Connected := false;
  IBCConnection1.Params.Clear;
  IBCConnection1.Params.Add('USER_NAME=SYSDBA');
  IBCConnection1.Params.Add('PASSWORD=masterkey');
  IBCConnection1.Connected := true;
  IBCTransaction1.Active := true;
   with IBCTable1 do begin
     active:=false;
    TableName:='EINSATZ';
     with FieldDefs do begin
      clear;
       Add('ID', ftInteger, 0, false); // AUTOINC Gibt es nicht, folgt später!!!
       Add('ICON', ftString, 20, false);
       Add('EINSATZNR', ftString, 10, false);
       Add('DATUM', ftString, 10, false);
       Add('ZEIT', ftString, 10, false);
       Add('EINSATZSTATUS', ftString, 10, false);
       Add('EINSATZSTICHWORT', ftString, 20, false);
       Add('EINSATZSTADT', ftString, 40, false);
       Add('EINSATZORT', ftString, 40, false);
       Add('EINSATZADRESSE', ftString, 40, false);
       Add('EINSATZMELDUNG', ftString, 100, false);
       Add('ELPNAME', ftString, 40, false);
       Add('ELPIP', ftString, 40, false);
       Add('EINSATZHINWEIS', ftString, 40, false);
       Add('EINSATZOBJEKT', ftString, 100, false);
   end;
    CreateTable; // Undeklarierter Bezeichner ???
  end;
 end;
end;

strom 1. Feb 2015 13:29

AW: Firebird CreateTable Fehlermeldung
 
Verstehe es einfach nicht! Müsste doch gehen oder nicht!

Code:
Data.DB.TDataSet.FieldDefs
Übergeordnet: TDataSet
Delphi
property FieldDefs: TFieldDefs read FFieldDefs write SetFieldDefs;

C++ 
__property TFieldDefs* FieldDefs = {read=FFieldDefs, write=SetFieldDefs};

Eigenschaften

Typ

Sichtbarkeit

Quelle

Unit

Übergeordnet

property public
Data.DB.pas

Data.DB.hpp
Data.DB TDataSet

Beschreibung

Zeigt auf die Liste der Felddefinitionen für die Datenmenge.

FieldDefs enthält die Felddefinitionen einer Datenmenge. Sie können diesen Wert in Ihren Anwendungen zwar lesen, um die Felddefinitionen zu ermitteln, sollten die Definitionen aber nur beim Erstellen einer neuen Tabelle mit CreateTable oder CreateDataSet ändern.

Um auf die Felder und Feldwerte in einer Datenmenge zuzugreifen, verwenden Sie die Eigenschaften Fields, AggFields und FieldValues sowie die Methode FieldsByName.

Anmerkung: Wenn die Datenmenge Objektfelder enthält, repräsentiert FieldDefs eine hierarchische Ansicht der Daten. Um die Definitionen als nichthierarchische Ansicht abzurufen, verwenden Sie stattdessen FieldDefList.

strom 1. Feb 2015 13:44

AW: Firebird CreateTable Fehlermeldung
 
auch mit einer Query ohne Erfolg! Was mache ich falsch?

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
 if FileExists(ExtractFilePath(Application.ExeName)+'ELP.fdb') then
  begin
   IBCTable1.TableName := 'EINSATZ';
   IBCTAble1.Active := true;
  end else
begin
  IBCConnection1.Database := ExtractFilePath(Application.ExeName)+'ELP.fdb';
  IBCConnection1.Params.Clear;
  IBCConnection1.Params.Add('USER ''SYSDBA''');
  IBCConnection1.Params.Add('PASSWORD ''masterkey''');
  IBCConnection1.Params.Add('PAGE_SIZE 4096');
  IBCConnection1.Params.Add('DEFAULT CHARACTER SET WIN1250');
  IBCConnection1.CreateDatabase;
  IBCConnection1.Connected := false;
  IBCConnection1.Params.Clear;
  IBCConnection1.Params.Add('USER_NAME=SYSDBA');
  IBCConnection1.Params.Add('PASSWORD=masterkey');
  IBCConnection1.Connected := true;
  IBCTransaction1.Active := true;
  with IBCQuery1 do
begin
   SQL.Clear;
   SQL.Add('create table "EINSATZ"');
   SQL.Add('(');
   SQL.Add(' ID autoinc,');
   SQL.Add(' Gruppe char(20),');
   SQL.Add(' Name char(30),');
   SQL.Add(' Vorname char(30),');
   SQL.Add(' Strasse char(30),');
   SQL.Add(' Hausnr char(10),');
   SQL.Add(' PLZ Char(10),');
   SQL.Add(' Ort char(20),');
   SQL.Add(' Telefon char(30),');
   SQL.Add(' primary key(ID)');
   SQL.Add(')');

   execsql;
end;

Perlsau 1. Feb 2015 13:59

AW: Firebird CreateTable Fehlermeldung
 
Was bedeutet "ohne Erfolg"? Fehlermeldung? Keine Tabelle? Fehlerhafte Tabelle?

strom 1. Feb 2015 14:10

AW: Firebird CreateTable Fehlermeldung
 
Also die Database ist da (ELP.fdb) aber
in der Database ist keine Tabelle vorhanden!

Fehlermeldung:

Dynamic SQL Error SQL error code= -204 Table unknown EINSATZ At line1, column15.

hstreicher 1. Feb 2015 14:19

AW: Firebird CreateTable Fehlermeldung
 
Firebird ist eine Transactionsorientierte Datenbank

Ohne abschließendes Commit oder Autocommit (nicht empfehlenswert) in den Einstellungen
werden Änderungen nicht sichtbar

Wie sind die Einstellungen der Transactionskomponente

strom 1. Feb 2015 14:29

AW: Firebird CreateTable Fehlermeldung
 
Die Eigenschaft "Auto Commit ist auf "true" gesetzt!

Perlsau 1. Feb 2015 16:10

AW: Firebird CreateTable Fehlermeldung
 
Vielleicht schaust du dir mal dieses Beispiel an, das zwar zur Geschwindigkeitsmessung entworfen wurde, aber ebenfalls eine Firebird-Tabelle erstellt, das mit einem vorausgehendem
Delphi-Quellcode:
IBTransaction1.StartTransaction;
und einem abschließendem
Delphi-Quellcode:
IBTransaction1.Commit;
arbeitet.

mkinzler 1. Feb 2015 17:14

AW: Firebird CreateTable Fehlermeldung
 
Delphi-Quellcode:
SQL.Add(' ID bigint not null,');
Autoinc dann per Generator+Trigger.

jobo 1. Feb 2015 17:59

AW: Firebird CreateTable Fehlermeldung
 
Zitat:

Zitat von strom (Beitrag 1288469)
Also die Database ist da (ELP.fdb) aber
in der Database ist keine Tabelle vorhanden!

Fehlermeldung:

Dynamic SQL Error SQL error code= -204 Table unknown EINSATZ At line1, column15.

Neben den bereits genannten Punkten:

Wieso steht der Tabellenname in doppelten Anführungsstrichen?

Hab kein Firebird am Start zum Test, aber wenn Du die Tabelle mit Quotes anlegst, musst Du sie auch genau so abfragen. Oder wie stellst Du die Existenz der Tabelle fest?
Lieber die Quotes weglassen, dann ist GroßKleinSchreibung beim Abfragen (DML) egal.

Hansa 1. Feb 2015 20:10

AW: Firebird CreateTable Fehlermeldung
 
Das mit den " " ist sicherlich eher ungünstig/völlig unnötig. Würde ich auch weglassen. Oder warum muss man da auf Gross/Kleinschreibung achten ? Auch unnötig finde ich, dass der User genötigt wird wohl eine Abfrage zu bestätigen, um eine Datenbank anzulegen, ohne die er wohl kaum loslegen könnte. Oder wird die DB automatisch erzeugt, sofern keine da ist ? Dann sehe ich überhaupt keinen Sinn mehr, die DB mit einem Delphi-Programm zu erzeugen. Lege doch die DB mit IBExpert an und fertig. Sich eine leere Datenbank anlegen zu müssen, das muss man nun wirklich nicht einem Endanwender zumuten. Die kriegen das womöglich so hin, dass nichts mehr geht. Kommt Abfrage, dann könnte ich mir sogar vorstellen, dass die Datenbank gar nicht installiert wird. Die Leute sind heute sehr vorsichtig damit, "irgendetwas" zu installieren, wenn sie nicht genau wissen warum. Geh mal auf die Strasse irgendjemand fragen, ob er weiss, was eine Datenbank ist. :shock: Allerdings taucht diese u.ä. Fragen hier desöfteren auf. Vielleicht kann mir mal jemand erklären, worin der Vorteil besteht, eine DB bei der Installation erst zu erzeugen, anstatt sie selber zu erzeugen, mitzuliefern und lediglich zu kopieren ? 8-)

Perlsau 1. Feb 2015 21:08

AW: Firebird CreateTable Fehlermeldung
 
Zitat:

Zitat von Hansa (Beitrag 1288496)
Allerdings taucht diese u.ä. Fragen hier desöfteren auf. Vielleicht kann mir mal jemand erklären, worin der Vorteil besteht, eine DB bei der Installation erst zu erzeugen, anstatt sie selber zu erzeugen, mitzuliefern und lediglich zu kopieren ? 8-)

Mir fällt da auch kein sinnvoller Grund ein, weshalb ich das auch noch nie gemacht habe und somit erstmal recherchieren mußte, um auf diese Anfrage hier antworten zu können. Auch bin ich dabei, mir abzugewöhnen, die Leute fragen zu wollen, weshalb sie das überhaupt so und nicht besser anders machen wollen, weil viele darauf entweder gar nicht antworten oder sich allein schon durch die Frage bevormundet oder bedrängt oder sonstwie belästigt fühlen und unwirsch reagieren.

p80286 1. Feb 2015 22:05

AW: Firebird CreateTable Fehlermeldung
 
Kommt darauf an, eine "Datenbank" für 300-400 Parameter oder ähnliche Kleinigkeiten, gerne als Kopie. "Richtige" Datenbanken nur als Script ! Nur dann haben wir im Vorfeld die Möglichkeit die Datenbank in die vorhandene Infrastruktur einzupassen.

Gruß
K-H

P.S.
vor ein paar Jahren hatte ich mit zwei Datenbanken zu tun, die sich gegenseitig ins Gehege kamen, da mußte dann von Hand ein wenig "getrickst" werden um beide parallel ans Laufen zu bekommen. Das möchte ich bei ichtigen Brocken nicht machen müssen.

Bernhard Geyer 1. Feb 2015 22:51

AW: Firebird CreateTable Fehlermeldung
 
Zitat:

Zitat von Hansa (Beitrag 1288496)
Oder warum muss man da auf Gross/Kleinschreibung achten ?

Wenn die Datenbank/das DBMS case-sensitive arbeitet dann ist das auch für den Datenbanknamen so.

Zitat:

Zitat von Hansa (Beitrag 1288496)
Auch unnötig finde ich, dass der User genötigt wird wohl eine Abfrage zu bestätigen, um eine Datenbank anzulegen, ohne die er wohl kaum loslegen könnte. Oder wird die DB automatisch erzeugt, sofern keine da ist ?

Für ein embedded System würde ich dir zustimmen. Bei einem richtigen Server würde ich mich als Admin "freuen" wenn Hinz und Kunz einfach so Datenbanken anlegen dürften.

Zitat:

Zitat von Hansa (Beitrag 1288496)
Dann sehe ich überhaupt keinen Sinn mehr, die DB mit einem Delphi-Programm zu erzeugen. Lege doch die DB mit IBExpert an und fertig. Sich eine leere Datenbank anlegen zu müssen, das muss man nun wirklich nicht einem Endanwender zumuten. Die kriegen das womöglich so hin, dass nichts mehr geht.

Bei einer Embedded DB müsste das on the fly gehen. Bei einem richtigen Server sind noch andere Punkte zu beachten wie Backup, Zugriffsregeln und Co. so das hier ein "einfacher Anwender" das einfach nicht machen darf.

Zitat:

Zitat von Hansa (Beitrag 1288496)
Vielleicht kann mir mal jemand erklären, worin der Vorteil besteht, eine DB bei der Installation erst zu erzeugen, anstatt sie selber zu erzeugen, mitzuliefern und lediglich zu kopieren ? 8-)

o.g. Gründe eines richtigen DBMS-Systems das einfach solche "nebensächlichkeiten" wie Zugriffsschutz, Backup, ... berücksichtigen muss.


Übrigens. ich finde unnötig das du bei Fragesätzen ein Leerzeichen vor dem Fragezeichen einfügst. Das mag fürs Französische gültig sein. Im Deutschen ist es einfach nur falsch.

Hansa 2. Feb 2015 16:19

AW: Firebird CreateTable Fehlermeldung
 
Zitat:

Wenn die Datenbank/das DBMS case-sensitive arbeitet dann ist das auch für den Datenbanknamen so.
Es geht um Firebird, da kann man nur durch Verwendung von " " ein Case-sensitiv für die jeweiligen Bezeichner erzwingen. Nur, wozu das ?

Zitat:

Für ein embedded System würde ich dir zustimmen. Bei einem richtigen Server würde ich mich als Admin "freuen" wenn Hinz und Kunz einfach so Datenbanken anlegen dürften.
...
Bei einer Embedded DB müsste das on the fly gehen. Bei einem richtigen Server sind noch andere Punkte zu beachten wie Backup, Zugriffsregeln und Co. so das hier ein "einfacher Anwender" das einfach nicht machen darf.
...
o.g. Gründe eines richtigen DBMS-Systems das einfach solche "nebensächlichkeiten" wie Zugriffsschutz, Backup, ... berücksichtigen muss.
Was soll man zu so einem Äpfel/Birnen - Durcheinander jetzt sagen ? Was hat eine embedded DB mit dem Anlegen einer DB zu tun ? Was ist in diesem Zusammenhang der Unterschied zwischen embedded und "richtigem" Server ? Was verstehst du überhaupt unter einem richtigen Server ? Was haben Zugriffsrechte damit zu tun ? Habe ich zu wenig Rechte, dann dürfte es zienlich egal sein, ob ich die Datenbank-Datei nicht kopiert bekomme oder mein Programm die nicht erzeugt bekommt.

Allerdings gibt es da noch einen gewaltigen Unterschied für den Enduser und das sollte man auch nicht unterschätzen. Kommt beim Kopieren ein Fehler, dann wird derjenige, der kopiert wohl denken, Datei scheint kaputt zu sein, "die sollen die neu schicken". Kommt die Fehlermeldung wiederholt direkt beim Programmstart, dann heisst es eventuell : Program läuft nicht, wird direkt wieder gelöscht. Ich schätze mal, Quote für letzteres liegt deutlich über 50 %.


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