2017-02-14 20 views
-1

Firebirdにテーブルを作成し、自動インクリメント用のカラムを設定したいができない。テーブルを作成することはできますが、自動インクリメント用の列は設定できません。DelphiでFirebirdでテーブルと自動インクリメントカラムを作成

私が使用しています:
Firebirdの組み込み2.5
のDelphi XE3
UniDAC Componnent

私の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

問題を説明し、発生したエラーを示してください。また、一度に複数のステートメントを実行しようとしていることにも注意してください.Firebird自体では許可されていないので、使用しているコンポーネントによって実際にサポートされていることを確認してください(別のステートメントで分割します)。 –

+0

それぞれのステートメントの後にコミットするのを忘れてはいますが、なぜこれらのステートメントがデルファイコードではなくデータベースレベルで実行されているのかわかりません。 – Fero

+0

@ Fero68作業単位全体の直後に、各DDL文の後にコミットする必要はありません。 –

答えて

0

はこれを試してみて、エラーが発生した場所を参照してください。スクリプトを保存してIBExpertやその他のツールで実行し、正しく実行されているかどうかを確認することもできます。

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; 
関連する問題