2017-02-14 6 views
-1

Ich möchte Tabelle in Firebird eingebettet erstellen und eine Spalte für die automatische Erhöhung, aber ich kann nicht. Ich kann die Tabelle erstellen, kann aber keine Spalte für automatisches Inkrement festlegen.Erstellen Sie Tabelle und Auto Inkrementieren Spalte in Firebird mit Delphi

Ich verwende:
Embedded Firebird 2.5
Delphi XE3
UniDAC Componnent

mein SQL-Befehl:

with UniSQL1 do 
    begin 
    SQL.Text := 'Create TABLE tab1(EMP_NO EMPNO NOT NULL, '+ 
    'FIRST_NAME   "FIRSTNAME" NOT NULL, '+ 
    'LAST_NAME    "LASTNAME" NOT NULL, '+ 
    'PHONE_EXT    VARCHAR( 4) COLLATE NONE, '+ 
'PRIMARY KEY (EMP_NO) '+ 
    '); '+ 
    'CREATE GENERATOR gen_tab1_EMP_NO; '+ 
    'SET GENERATOR gen_tab1_EMP_NO TO 0; '+ 
    'SET TERM !! ; '+ 
    'CREATE TRIGGER SET_EMP_NO FOR tab1 ACTIVE BEFORE INSERT POSITION 0 AS '+ 
    'BEGIN '+ 
     'if (new.emp_no is null) then '+ 
     'new.emp_no = gen_id(gen_tab1_EMP_NO, 1); '+ 
    'END !!'+ 
    'SET TERM ; !!'; 

    try 
     Execute; 
     ShowMessage('Table Created'); 
    except 
     ShowMessage('Table Not Created'); 
    end; 
    end; 
+1

Bitte beschreiben Sie das Problem, und zeigen Sie alle Fehler, die Sie erhalten. Beachten Sie auch, dass Sie versuchen, mehrere Anweisungen gleichzeitig auszuführen: Firebird selbst lässt dies nicht zu, stellen Sie also sicher, dass dies tatsächlich von der Komponente unterstützt wird, die Sie verwenden (dh es teilt sie in separate Anweisungen für Sie auf). –

+0

Vergessen Sie nicht, nach jeder Anweisung zu committen, aber ich weiß nicht, warum Sie diese Anweisungen nicht auf einer Datenbank-Ebene statt in Delphi-Code ausführen, da diese Anweisungen sicherlich nur einmal ausgeführt werden. – Fero

+0

@ Fero68 Es ist nicht notwendig, nach jeder DDL-Anweisung zu committen, gleich nach der ganzen Arbeitseinheit. –

Antwort

0

die Sie interessieren und sehen, wo Fehler auftritt. Sie können auch versuchen, Ihr Skript zu speichern und auf IBExpert oder einem anderen Tool auszuführen und zu sehen, ob es ordnungsgemäß ausgeführt wird.

with UniSQL1 do 
begin 
    SQL.Clear; 
    SQL.Add('Create TABLE tab1('); 
    SQL.Add( EMP_NO EMPNO NOT NULL,'); 
    SQL.Add(' FIRST_NAME "FIRSTNAME" NOT NULL,'); 
    SQL.Add(' LAST_NAME "LASTNAME" NOT NULL,'); 
    SQL.Add(' PHONE_EXT VARCHAR(4) COLLATE NONE,'); 
    SQL.Add(' PRIMARY KEY (EMP_NO)'); 
    SQL.Add(')'); 
    try 
     Execute; 
    except 
     on E:Exception do 
      raise Exception.Create('ERROR 1:' + sLineBreak + E.Message); 
    end; 

    SQL.Clear; 
    SQL.Add('CREATE GENERATOR gen_tab1_EMP_NO;'); 
    try 
     Execute; 
    except 
     on E:Exception do 
      raise Exception.Create('ERROR 2:' + sLineBreak + E.Message); 
    end; 

    SQL.Clear; 
    SQL.Add('SET GENERATOR gen_tab1_EMP_NO TO 0;'); 
    try 
     Execute; 
    except 
     on E:Exception do 
      raise Exception.Create('ERROR 3:' + sLineBreak + E.Message); 
    end; 

    SQL.Clear; 
    SQL.Add('CREATE TRIGGER SET_EMP_NO FOR tab1 ACTIVE BEFORE INSERT POSITION 0 AS'); 
    SQL.Add('BEGIN'); 
    SQL.Add(' if (new.emp_no is null) then'); 
    SQL.Add('  new.emp_no = gen_id(gen_tab1_EMP_NO, 1);'); 
    SQL.Add('END' 
    try 
     Execute; 
    except 
     on E:Exception do 
      raise Exception.Create('ERROR 4:' + sLineBreak + E.Message); 
    end; 
end; 
Verwandte Themen