2010-05-04 13 views
3

J'utilise D2K9, Zeos 7alpha et Firebird 2.1Delphi: comment créer la base de données Firebird programme

J'ai eu ce travail avant que j'ajouté le champ autoinc. Bien que je ne sois pas sûr de le faire correctement à 100%. Je ne connais pas l'ordre de faire le code SQL, avec les déclencheurs, les générateurs, etc. J'ai essayé plusieurs combinaisons, je suppose que je fais quelque chose de mal autre que ça pour que ça ne marche pas.

Démo actuelle: http://uploading.com/files/bd64d8m9/createdb.zip/

erreur actuelle:

It's getting an error here: 

SQL Error: Dynamic SQL Error SQL error code = -104 Token unknown - line 2, column 1 SET. 
Error Code: -104. Invalid token The SQL: 
CREATE GENERATOR GEN_EMAIL_ACCOUNTS_ID; 

SET GENERATOR GEN_EMAIL_ACCOUNTS_ID À 1;

fichier SQL à partir IBExpert:

/******************************************************************************/ 
/*     Generated by IBExpert 5/4/2010 3:59:48 PM     */ 
/******************************************************************************/ 

/******************************************************************************/ 
/*  Following SET SQL DIALECT is just for the Database Comparer   */ 
/******************************************************************************/ 
SET SQL DIALECT 3; 



/******************************************************************************/ 
/*         Tables         */ 
/******************************************************************************/ 


CREATE GENERATOR GEN_EMAIL_ACCOUNTS_ID; 

CREATE TABLE EMAIL_ACCOUNTS (
    ID   INTEGER NOT NULL, 
    FNAME  VARCHAR(35), 
    LNAME  VARCHAR(35), 
    ADDRESS  VARCHAR(100), 
    CITY   VARCHAR(35), 
    STATE  VARCHAR(35), 
    ZIPCODE  VARCHAR(20), 
    BDAY   DATE, 
    PHONE  VARCHAR(20), 
    UNAME  VARCHAR(255), 
    PASS   VARCHAR(20), 
    EMAIL  VARCHAR(255), 
    CREATEDDATE DATE, 
    "ACTIVE"  BOOLEAN DEFAULT 0 NOT NULL /* BOOLEAN = SMALLINT CHECK (value is null or value in (0, 1)) */, 
    BANNED  BOOLEAN DEFAULT 0 NOT NULL /* BOOLEAN = SMALLINT CHECK (value is null or value in (0, 1)) */, 
    "PUBLIC"  BOOLEAN DEFAULT 0 NOT NULL /* BOOLEAN = SMALLINT CHECK (value is null or value in (0, 1)) */, 
    NOTES  BLOB SUB_TYPE 0 SEGMENT SIZE 1024 
); 




/******************************************************************************/ 
/*        Primary Keys        */ 
/******************************************************************************/ 

ALTER TABLE EMAIL_ACCOUNTS ADD PRIMARY KEY (ID); 


/******************************************************************************/ 
/*         Triggers         */ 
/******************************************************************************/ 


SET TERM^; 



/******************************************************************************/ 
/*       Triggers for tables        */ 
/******************************************************************************/ 



/* Trigger: EMAIL_ACCOUNTS_BI */ 
CREATE OR ALTER TRIGGER EMAIL_ACCOUNTS_BI FOR EMAIL_ACCOUNTS 
ACTIVE BEFORE INSERT POSITION 0 
AS 
BEGIN 
    IF (NEW.ID IS NULL) THEN 
    NEW.ID = GEN_ID(GEN_EMAIL_ACCOUNTS_ID,1); 
END 
^ 


SET TERM ;^



/******************************************************************************/ 
/*         Privileges         */ 
/******************************************************************************/ 

Triggers:

/******************************************************************************/ 
/*  Following SET SQL DIALECT is just for the Database Comparer   */ 
/******************************************************************************/ 
SET SQL DIALECT 3; 

CREATE GENERATOR GEN_EMAIL_ACCOUNTS_ID; 

SET TERM^; 



CREATE OR ALTER TRIGGER EMAIL_ACCOUNTS_BI FOR EMAIL_ACCOUNTS 
ACTIVE BEFORE INSERT POSITION 0 
AS 
BEGIN 
    IF (NEW.ID IS NULL) THEN 
    NEW.ID = GEN_ID(GEN_EMAIL_ACCOUNTS_ID,1); 
END 
^ 


SET TERM ;^

Générateurs:

CREATE SEQUENCE GEN_EMAIL_ACCOUNTS_ID; 
ALTER SEQUENCE GEN_EMAIL_ACCOUNTS_ID RESTART WITH 2; 

/* Old syntax is: 
CREATE GENERATOR GEN_EMAIL_ACCOUNTS_ID; 
SET GENERATOR GEN_EMAIL_ACCOUNTS_ID TO 2; 
*/ 

Mon code: Demo dans les commentaires ci-dessous.

+3

Si vous fournissez un tel mur de texte, cela décourage les gens.N'utilisez pas les balises 'code' et' pre', utilisez plutôt le bouton de la barre d'outils de mise en forme du code dans l'éditeur, ou indentez simplement votre code de 4 espaces. En outre, supprimez tout ce qui n'est pas nécessaire pour que les gens comprennent le problème, comme les nombreux commentaires et les lignes vides du script IBExpert. – mghie

+0

Je n'ai pas de barre d'outils de mise en forme du code qui s'affiche ... mais j'essaierai de tout mettre en forme un peu mieux la prochaine fois, même si ça se voit bien dans mon navigateur. – Brad

+0

Il ne s'affiche pas correctement ici (Firefox sur Mac OS X). Et vous devriez avoir le bouton de formatage, c'est celui avec les petits "0" et "1" sur la barre d'outils au-dessus du contrôle d'édition, qui a l'indice "Code Sample ...". – mghie

Répondre

2

Généralement, vous pouvez créer des objets de base de données Firebird dans n'importe quel ordre, à condition qu'ils ne dépendent pas l'un de l'autre. Si c'est le cas, vous devez évidemment créer les objets dépendants avant de créer les objets dépendants.

Si vous avez des objets avec des références circulaires, créez d'abord l'un d'entre eux avec un corps vide, créez l'autre, puis remplissez le contenu du premier en utilisant l'instruction ALTER TABLE ou correspondante. Des outils tels que IBExpert, Database Workbench ou FlameRobin analysent les dépendances, donc suivre l'ordre de création dans les scripts écrits par eux devrait toujours fonctionner. Si votre script créé IBExpert fonctionne, mais que votre propre code fait les choses dans le même ordre ne fonctionne pas, la cause de cela peut être que IBExpert valide chaque instruction DDL séparément (alors que votre code ne le fait pas). Vous pouvez faire de même dans votre code, et vous devriez. Votre colonne autoinc implique un trigger, qui dépend lui-même d'un générateur, donc assurez-vous de valider après la création de la table et du générateur, avant de créer le trigger.

Edit:

Vous devez vous assurer que vous n'exécuter plusieurs instructions avec des composants de base de données qui sont en mesure de le faire. Je ne connais pas Zeos, mais à partir de this knowledge base article il semble que les deux TZQuery et TZUpdateSQL prennent en charge plusieurs instructions dans un appel d'exécution. Vous pouvez également utiliser TZSQLProcessor pour charger le script complet créé par IBExpert et l'exécuter. D'autre part, la méthode TZConnection.ExecuteDirect() peut ne pas prendre en charge plusieurs instructions, et dans ce cas vous obtiendrez des erreurs de syntaxe après la fin de la première instruction. Cette

CREATE GENERATOR GEN_EMAIL_ACCOUNTS_ID; 
SET GENERATOR GEN_EMAIL_ACCOUNTS_ID TO 2; 

sont deux déclarations, et vous devrez peut-être passer chaque séparément à TZConnection.ExecuteDirect().

+0

pouvez-vous me montrer ce que vous voulez dire en faisant chaque DDL séparément? Je pensais que je les faisais séparément. – Brad

+0

@Brad: Vous les faites séparément, mais vous devrez peut-être valider votre travail aussi. Soit vous pouvez définir une option Zeos pour auto-valider DDL, soit vous devez valider la transaction explicitement. Je n'ai pas d'expérience avec Zeos, mais quelque chose comme 'Commit()' ou 'CommitRetaining()' devrait être disponible sur l'objet de base de données ou sur un objet de transaction dédié. Pour plus d'informations sur les transactions, voir par exemple les articles sur http://firebirdfaq.org. – mghie

+0

autoCommit était déjà activé. – Brad