Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi PrimaryKey in einer Paradox-DB löschen und erstellen (https://www.delphipraxis.net/81448-primarykey-einer-paradox-db-loeschen-und-erstellen.html)

gnr82 27. Nov 2006 15:49

Datenbank: Paradox • Version: 5.0 • Zugriff über: SQL

PrimaryKey in einer Paradox-DB löschen und erstellen
 
Hallo,

ich habe folgendes Problem:

Ich benötige eine Tabelle (in einer Paradox-DB) die einen PrimaryKey besitz, gleichzeitig möchte ich die Struktur der Tabelle ändern können (Spalte hinzufügen, ändern, löschen, etc.). Derzeit ist das ändern allerdings nur möglich, wenn die Tabelle keinen Primärschlüssel besitzt. :wall:
Also war für mich jetzt der einfachste Weg den Primärschlüssel für die Zeit, in der ich Änderungen vornehme, herauszunehmen und danach wieder einzufügen. Leider funktioniert das nicht. Ich kann weder den Primärschlüssel entfernen, noch setzten wenn keiner da ist. :gruebel:

Anbei noch Auszüge aus dem Quellcode:
Delphi-Quellcode:
//
doADOquery(optionsarray[2],
           'alter table EXPORT add constraint PRIMARYKEY1 primary key (ID)',
           true,
           false);

doADOquery(optionsarray[2],
           'alter table EXPORT drop constraint PRIMARYKEY1',
           true,
           false);
Danke für eure Hülfe

shmia 27. Nov 2006 16:29

Re: PrimaryKey in einer Paradox-DB löschen und erstellen
 
Deine Tabelle heisst "EXPORT". Das könnte aber ein reserviertes Wort sein.
Versuche mal die Tabelle umzubenennen oder setze den Tabellennamen in Anführungszeichen.

Laut LocalSQL.hlp löscht man den Primärschlüssel so
SQL-Code:
DROP INDEX orders.PRIMARY
Wenn alle Stricke reisen, musst du eine neue Tabelle mit der neuen Struktur erzeugen
und die Daten aus der Tabelle rüberkopieren.

gnr82 27. Nov 2006 19:45

Re: PrimaryKey in einer Paradox-DB löschen und erstellen
 
Hallo nochmal.

Ich lösch jetzt doch die ganze tabelle und erstell diese über SQL-Anweisung neu. Das funktioniert soweit ganz gut, bis auf ... den PrimaryKey. :(

Fehlermeldung (Zitat):
Die Eigenschaften wird für externe Datenquellen oder für Datenbanken, die in einer früheren Version von Microsoft Jet erstellt wurden, nicht unterstützt.
:?: :wiejetzt:

Eine Idee woran das liegen kann?


Ich will doch nur eine Paradox-Datenbank mit einem PrimaryKey erstellen...

Könnt Ihr mir da nochmal helfen???

Danke

mkinzler 27. Nov 2006 20:08

Re: PrimaryKey in einer Paradox-DB löschen und erstellen
 
Wie sieht das Statement aus?

gnr82 27. Nov 2006 22:40

Re: PrimaryKey in einer Paradox-DB löschen und erstellen
 
SQL-Script:

create table "test.db" (
id integer not null primary key,
test char(50))

mkinzler 28. Nov 2006 05:57

Re: PrimaryKey in einer Paradox-DB löschen und erstellen
 
Das DDL-Statement müßte so eigentlich funktionieren.
Funktioniert die Erzeugung ohne Primärschlüssel?
Funktioniert das spätere Hinzufügen des Selbigen als Constraint?

Andreas Schilling 28. Nov 2006 06:23

Re: PrimaryKey in einer Paradox-DB löschen und erstellen
 
Ich kenne nur den Weg über die BDE-Komponenten TTable. Vielleicht läßt sich das aber verwenden.
Delphi-Quellcode:
Uses
  DB, DBTables, SysUtils;

Function ChkANAMNESE(DName: String): Boolean;
  {Die Funktion ChkANAMNESE erzeugt die  Datei ANAMNESE.DB
   falls diese noch nicht existiert.
   Ist das Ergebnis True, so wurde die Tabelle neu erstellt.}
Function ChkIdxANAMNESE(DName: String): Boolean;
  {Die Funktion ChkIdxANAMNESE erzeugt die  Indizes der Datei ANAMNESE.DB
   falls diese noch nicht existieren.
   Ist das Ergebnis True, so wurden die Indizes neu erstellt.}

Implementation

Function ChkANAMNESE;
Begin
  Result:=False;
  If Not FileExists(DName) Then
  With TTable.Create(Nil) Do
  Begin
    TableName:=DName;
    With FieldDefs Do
    Begin
      Add('AnamneseID',TFieldType(14),0,False);
      Add('PR_ID',TFieldType(3),0,True);
      Add('Datum',TFieldType(9),0,True);
      Add('Parameter',TFieldType(1),30,False);
      Add('Ergebnis_ID',TFieldType(3),0,True);
      Add('LE_ID',TFieldType(3),0,True);
      Add('Text',TFieldType(16),25,False);
      Add('Bemerkungen',TFieldType(1),100,False);
      Add('LetzteVeraenderungUser',TFieldType(1),8,True);
      Add('LetzteVeraenderungZeit',TFieldType(11),0,True);
      Add('RecordStatus',TFieldType(3),0,False);
    End; {end with FieldDefs}
    CreateTable;
    Result:=True;
    Free;
    ChkIdxANAMNESE(DName);
  End; {end with TTable}
End; {end Function}

Function ChkIdxANAMNESE;
Begin
  Result:=False;
  With TTable.Create(Nil) do
  Begin
    TableName:=DName;
    Exclusive:=True;
    Open;
    IndexDefs.Clear;
    AddIndex('','AnamneseID', []+[ixPrimary]+[ixUnique]);
    AddIndex('PRIDDatum_Index','PR_ID;Datum', []+[ixCaseInsensitive]);
    Close;
    Free;
  End; {end with TTable}
End; {end Function}

End.

mkinzler 28. Nov 2006 06:25

Re: PrimaryKey in einer Paradox-DB löschen und erstellen
 
Wenn schon BDE dann TQuery!

marabu 28. Nov 2006 06:31

Re: PrimaryKey in einer Paradox-DB löschen und erstellen
 
Guten Morgen,

hier wird mit LocalSQL gearbeitet, nicht mit SQL:

SQL-Code:
CREATE TABLE "test.db" (
  id INTEGER,
  test CHAR(50),
  PRIMARY KEY (id)
)
Gültigkeitsbeschränkungen werden von der BDE verwaltet und nicht über LocalSQL manipuliert.

Grüße vom marabu

Ines 28. Nov 2006 06:56

Re: PrimaryKey in einer Paradox-DB löschen und erstellen
 
Hallo, ich hatte vor kurzem ähnlichen Fehler (allerdings BDE).

Zitat:

Zitat von gnr82
Ich will doch nur eine Paradox-Datenbank mit einem PrimaryKey erstellen...

Bei mir lag es daran, daß das Feld zum Erstellen des PrimaryKeys nicht das erste Feld in der Tabelle war. Nach dem Ändern der Tabellenstruktur hat dann das Setzen des PrimaryKeys funktioniert.

Viele Grüße
Ines

gnr82 28. Nov 2006 14:04

Re: PrimaryKey in einer Paradox-DB löschen und erstellen
 
Zitat:

Zitat von marabu
Guten Morgen,

hier wird mit LocalSQL gearbeitet, nicht mit SQL:

SQL-Code:
CREATE TABLE "test.db" (
  id INTEGER,
  test CHAR(50),
  PRIMARY KEY (id)
)
Gültigkeitsbeschränkungen werden von der BDE verwaltet und nicht über LocalSQL manipuliert.

Grüße vom marabu

Danke erstmal für den Tipp,

allerdings funktst das bei mir nicht! Bei mir kommt bei der Verwendung dieser SQL-Anweisung die Fehlermeldung "Allgemeiner SQL-Fehler". Verwende ich die SQL-Anweisung aber ohne die PRIMARY KEY - Sache funktionierts!

Ich glaub ich mach da noch irgendwas falsch ...

gnr82 28. Nov 2006 14:09

Re: PrimaryKey in einer Paradox-DB löschen und erstellen
 
Zitat:

Zitat von mkinzler
Das DDL-Statement müßte so eigentlich funktionieren.
Funktioniert die Erzeugung ohne Primärschlüssel?
Funktioniert das spätere Hinzufügen des Selbigen als Constraint?

Hallo mkinzler,

das hinzufügen des primärschlüssels im nachhinein funktioniert, so wie ich's probiert hab, auch nicht. Kann aber auch sein, dass ich da wieder ein falsches syntax verwendet hab. Das Erzeugen ohne Primärschlüssel funktioniert ohne Probleme.

raiguen 28. Nov 2006 15:28

Re: PrimaryKey in einer Paradox-DB löschen und erstellen
 
Zitat:

Zitat von gnr82
das hinzufügen des primärschlüssels im nachhinein funktioniert, so wie ich's probiert hab, auch nicht. Kann aber auch sein, dass ich da wieder ein falsches syntax verwendet hab. Das Erzeugen ohne Primärschlüssel funktioniert ohne Probleme.

Ein PrimärSchlüssel mithilfe eines DDL-Statements kann nur in der Art erstellt werden, wie marabu das beschrieben hat (Beitrag #9).
In LocalSQL (und soweit ich weiß, in anderen SQL-Languages auch nicht) kann KEIN PrimärSchlüssel nachträglich erzeugt werden; SekundärSchlüssel bzw weitere Indizes dagegen sehr wohl (hier mal die Hilfe zu LocalSQL zu Rate ziehen).
Um den PrimärSchlüssel einer (mit LocalSQL) neu erzeugten ParadoxTabelle nachträglich zu kreieren, fällt mir nur die Methode Table.AddIndex() ein, nicht gerade elegant, aber funktionabel.
Was lernen wir daraus? Wenn über DDL-Statement eine Tabelle neu erzeugt werden soll, dann gleich mit PrimärSchlüssel:wink:

gnr82 28. Nov 2006 16:04

Re: PrimaryKey in einer Paradox-DB löschen und erstellen
 
Zitat:

Zitat von raiguen
Zitat:

Zitat von gnr82
das hinzufügen des primärschlüssels im nachhinein funktioniert, so wie ich's probiert hab, auch nicht. Kann aber auch sein, dass ich da wieder ein falsches syntax verwendet hab. Das Erzeugen ohne Primärschlüssel funktioniert ohne Probleme.

Ein PrimärSchlüssel mithilfe eines DDL-Statements kann nur in der Art erstellt werden, wie marabu das beschrieben hat (Beitrag #9).
In LocalSQL (und soweit ich weiß, in anderen SQL-Languages auch nicht) kann KEIN PrimärSchlüssel nachträglich erzeugt werden; SekundärSchlüssel bzw weitere Indizes dagegen sehr wohl (hier mal die Hilfe zu LocalSQL zu Rate ziehen).
Um den PrimärSchlüssel einer (mit LocalSQL) neu erzeugten ParadoxTabelle nachträglich zu kreieren, fällt mir nur die Methode Table.AddIndex() ein, nicht gerade elegant, aber funktionabel.
Was lernen wir daraus? Wenn über DDL-Statement eine Tabelle neu erzeugt werden soll, dann gleich mit PrimärSchlüssel:wink:

Ich hab ja auch versucht den PrimaryKey beim ertellen der Datenbank zu erzeugen, irgendwie funktionierts aber nicht...

SQL-Code:
create table "test.db" (ID integer,TEST char(255),PRIMARY KEY(ID))
Noch eine Idee woran es liegen könnte? Ist das script soweit OK?

Danke nochmal!!!

raiguen 28. Nov 2006 17:12

Re: PrimaryKey in einer Paradox-DB löschen und erstellen
 
Zitat:

Zitat von gnr82
Ich hab ja auch versucht den PrimaryKey beim ertellen der Datenbank zu erzeugen, irgendwie funktionierts aber nicht...

SQL-Code:
create table "test.db" (ID integer,TEST char(255),PRIMARY KEY(ID))
Noch eine Idee woran es liegen könnte? Ist das script soweit OK?

Danke nochmal!!!

Hmm... :gruebel: kann ich mir nicht vorstellen, da dein Script okay ist und bei mir ohne Murren ausgeführt wird. Bist du sicher, dass da nix passiert? In welchem Ordner wird die Tabelle (Datenbank ist doch wohl etwas zu hochgegriffen ;) ) denn erstellt? In der Regel in dem Verzeichnis, was in der Eigenschaft .DatabaseName der Query eingetragen ist... HAst du denn mal die Suchfunktion von Windows bemüht und nach dieser 'verschwundenen' Tabelle gefahndet (natürlich über sämtliche Laufwerke)?
Gibt Delphi bzw dein Prog eine Fehlermeldung? Oder tut es nur so als ob?

marabu 28. Nov 2006 17:26

Re: PrimaryKey in einer Paradox-DB löschen und erstellen
 
Sorry,

bei genauem Hinschauen sehe ich, dass ADO an Bord ist. Dann wird nicht mit SQL und auch nicht mit LocalSQL gearbeitet, sondern mit JetSQL. Probiere es mal so:

SQL-Code:
/* create table */
CREATE TABLE test (id INTEGER, test CHAR(255))

/* create primary index */
CREATE INDEX test ON test(id)
Viel Glück

gnr82 28. Nov 2006 17:49

Re: PrimaryKey in einer Paradox-DB löschen und erstellen
 
Zitat:

Zitat von raiguen
Zitat:

Zitat von gnr82
Ich hab ja auch versucht den PrimaryKey beim ertellen der Datenbank zu erzeugen, irgendwie funktionierts aber nicht...

SQL-Code:
create table "test.db" (ID integer,TEST char(255),PRIMARY KEY(ID))
Noch eine Idee woran es liegen könnte? Ist das script soweit OK?

Danke nochmal!!!

Hmm... :gruebel: kann ich mir nicht vorstellen, da dein Script okay ist und bei mir ohne Murren ausgeführt wird. Bist du sicher, dass da nix passiert? In welchem Ordner wird die Tabelle (Datenbank ist doch wohl etwas zu hochgegriffen ;) ) denn erstellt? In der Regel in dem Verzeichnis, was in der Eigenschaft .DatabaseName der Query eingetragen ist... HAst du denn mal die Suchfunktion von Windows bemüht und nach dieser 'verschwundenen' Tabelle gefahndet (natürlich über sämtliche Laufwerke)?
Gibt Delphi bzw dein Prog eine Fehlermeldung? Oder tut es nur so als ob?

Na das ist ja das Problem, ohne den PrimaryKey funktioniert das Script und eine Db wird auch erzeugt. Mit dem Primary Key kommt Fehlermeldung 'Allgemeiner SQL-Fehler'. Woran kann das liegen? Ich benutze eine TQuery, ist das soweit OK? Und eine Datenbank wird definitiv nicht erzeugt! Was muss ich noch für Einstellungen bei der Query beachten?

:cry:

mkinzler 28. Nov 2006 17:52

Re: PrimaryKey in einer Paradox-DB löschen und erstellen
 
Zitat:

Ich benutze eine TQuery,
Du bist also jetzt auf die BDE umgeschwenkt, dann nimm Achims (Marabu) erster Beitrag

gnr82 29. Nov 2006 07:46

Re: PrimaryKey in einer Paradox-DB löschen und erstellen
 
Hallo marabu, hallo mkinzler,

ich habs immer noch nicht hinbekommen ...

Ich habs mit beiden angegebenen SQL-Anweisungen versucht hier noch mal der Code:

- der erste Versuch (Fehlermeldung "Allgemeiner SQL-Fehler")
SQL-Code:
create table "TEST.db" (ID Integer,TEST Float,PRIMARY KEY (ID))
-der zweite Versuch (Fehlermeldung "Indexfehler")
SQL-Code:
create table "TEST.db" (ID Integer,TEST Float)

CREATE INDEX TEST ON TEST(ID)
Wie gesagt, ich benutze TQuery und es soll eine Paradox 5.0 erstellt werden. Kann es da noch Probleme geben?

hoika 29. Nov 2006 08:00

Re: PrimaryKey in einer Paradox-DB löschen und erstellen
 
Hallo,

das erste Script muss funktionieren.
Fehlt bei deiner Query vielleicht ein SQL.Clear davor ?

Zu der zweiten Variante.
Die beiden Befehle dürfen bei Paradox natürlich nicht auf einmal geschickt werden,
sondern hintereinander!
aber wie gesagt, die erste muss klappen.

Ausserdem ist in enem Minimalbeispiel das "Float" fehl am Platz.
In der Bde heisst das NUMERIC(8,2) (oder mehr als 8).

Weiterhin sollte ein Indexname nicht so heissen wie der Tabellenname,
z.B. Idx_bla.
Das aber nur am Range, weil der Primärindex unter Paradox keinen Namen
hat, er ist leer.

Table.IndexName:= ''; wäre also im Code später das richtige Umschalten.


Aufpassen würde ich bei der BDE auch mit dem Level (DB-Version beim Erzeugen).

BDE-Konfiguration
Treiber->Native->Paradox Level muss mindestens auf 5 stehen.


Heiko
PS:
Zeig mal eine abgespeckte Variante deines Codes.

marabu 29. Nov 2006 08:16

Re: PrimaryKey in einer Paradox-DB löschen und erstellen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,

die Skripte sind für unterschiedliche Zugriffstechniken gedacht, also bitte genau lesen.

Bei JetSQL ist es Vorschrift, dass der Name des primary index mit dem der Tabelle identisch ist. Der MS Paradox-Treiber macht das dann schon richtig.

Anbei ein D5-Testprogramm, welches bei mir funktioniert.

Freundliche Grüße

gnr82 29. Nov 2006 09:26

Re: PrimaryKey in einer Paradox-DB löschen und erstellen
 
Vielen Dank, habs hinbekommen. Hab in Databasename den Pfad nicht richtig angageben ...

Komich das die ganze Erstellerei ohne PrimaryKey aber geklappt hat ... Sei's drum!

Danke an alle für eure Hilfe, besonders an (Achim) marabu!

Schöne Woche noch

Clemens


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