2017-02-14 1 views
-1

Je veux créer une table dans Firebird embedded et définir une colonne pour l'incrémentation automatique, mais je ne peux pas. Je peux créer la table, mais je ne peux pas définir une colonne pour l'incrémentation automatique.Créer une table et une colonne d'incrémentation automatique dans Firebird avec Delphi

J'utilise:
Firebird 2.5 embedded
Delphi xe3
UniDAC Componnent

ma commande SQL:

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

Veuillez décrire le problème et signaler toute erreur. Notez également que vous essayez d'exécuter plusieurs instructions à la fois: Firebird lui-même ne le permet pas, alors assurez-vous que cela est réellement supporté par le composant que vous utilisez (ie: il le divise en instructions séparées pour vous). –

+0

N'oubliez pas de valider après chaque instruction, mais je ne sais pas pourquoi vous n'exécutez pas ces instructions au niveau de la base de données plutôt que dans le code Delphi, car ces instructions ne seront sûrement exécutées qu'une seule fois. – Fero

+0

@ Fero68 Il n'est pas nécessaire de valider après chaque instruction DDL, juste après l'unité de travail entière. –

Répondre

0

Essayez et voir où se produit l'erreur. Vous pouvez aussi essayer d'enregistrer votre script et de l'exécuter sur IBExpert ou un autre outil et voir si cela fonctionne correctement.

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;