IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bases de données Delphi Discussion :

firebird créer base de données avec code


Sujet :

Bases de données Delphi

  1. #1
    Membre expérimenté
    Avatar de ouiouioui
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2006
    Messages
    984
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 984
    Points : 1 418
    Points
    1 418
    Par défaut firebird créer base de données avec code
    Bonjour, j'ai fini de crée ma base de données firebird j'ai le model dans un txt avec toutes mes tables etc et la je voudrais la créer en code mais je bloque sur 'SET TERM ^ ;' cette requette SQL avec IBX me dit :
    a déclenché la classe d'exception EIBInterBaseError avec le message 'Dynamic SQL Error
    SQL error code = -104
    Token unknown - line 1, column 5
    TERM'.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    Function TdmDB.CreateNewDB(Const sName, sUser, sPass: String): Boolean;
     
      Procedure cmd(sLine: String; NewDB: TIBDatabase);
      Var
        ibt: TIBTransaction;
        ibq: TIBQuery;
      Begin
        ibt := TIBTransaction.Create(nil);
        ibq := TIBQuery.Create(nil);
        Try
          NewDB.DefaultTransaction := ibt;
          If Not ibt.InTransaction Then
            ibt.StartTransaction;
          Try
     
            With ibq Do
            Begin
              DataBase    := NewDB;
              Transaction := ibt;
              //        rs       := TResourceStream.Create(HInstance , 'DBTMYCARD', 'RT_RCDATA');
              //        Try
              //          SQL.LoadFromStream(rs);
              //        Finally
              //          rs.Free;
              //        End;
              SQL.Text    := sLine;
              Prepare;
              ExecSQL;
            End;
     
            ibt.CommitRetaining;
     
          Except
            ibt.RollbackRetaining;
          End;
     
        Finally
          ibt.Free;
          ibq.Free;
        End;
      End;
     
    Var
      NewDB: TIBDatabase;
      //  rs:    TResourceStream;
    Begin
      Result := False;
     
      NewDB := TIBDatabase.Create(nil);
      Try
        //user_name=SYSDBA
        //password=masterkey
        //lc_ctype=UNICODE_FSS
        //sql_role_name=3
        {$IFDEF DEBUG}
        DeleteFile(ChangeFileExt(sName, '.db'));
        {$ENDIF}
     
        NewDB.DatabaseName := ChangeFileExt(sName, '.db');
        NewDB.Params.Add('USER ''' + sUser + '''');
        NewDB.Params.Add('PASSWORD ''' + sPass + '''');
        NewDB.Params.Add('PAGE_SIZE 4096');
        NewDB.Params.Add('DEFAULT CHARACTER SET UTF8');
        NewDB.CreateDatabase;
     
        Cmd('CREATE TABLE MY_CARD (' + 'ID INTEGER NOT NULL,' + 'DATE_REGISTER TIMESTAMP DEFAULT ''NOW'',' +
          'ID_CUSTOMER INTEGER NOT NULL,' + 'SURNAME VARCHAR(255) CHARACTER SET NONE NOT NULL COLLATE NONE,' +
          '"NAME" VARCHAR(200) CHARACTER SET NONE NOT NULL COLLATE NONE,' + 'NB_SEANCE INTEGER NOT NULL,' +
          'ISUNLIMITED INTEGER NOT NULL,' + 'DATE_EXPIRE TIMESTAMP NOT NULL,' + 'BARCODE BIGINT NOT NULL,' +
          'LASTCHECK TIMESTAMP,' + 'TOPRINT INTEGER DEFAULT 0);', NewDB);
     
        Cmd('ALTER TABLE MY_CARD ADD PRIMARY KEY (ID);', NewDB);
     
        Cmd('SET TERM ^ ;', NewDB);
     
        Cmd('CREATE TRIGGER BI_MY_CARD_ID FOR MY_CARD ACTIVE BEFORE INSERT POSITION 0 AS BEGIN ' +
          'IF (NEW.ID IS NULL) THEN NEW.ID = GEN_ID(MY_CARD_ID_GEN, 1); END^', NewDB);
     
        Cmd('SET TERM ; ^', NewDB);
     
        Result := True;
      Finally
        NewDB.Free;
      End;
    End;
    et en plus écrire tout en dur est super long et galère à maintenir. Je suis ouvert à toute idée pour simplifier sa. Merci.
    Il existe 3 sortes de gens: ceux qui savent compter et ceux qui ne savent pas.

  2. #2
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut
    Salut

    j'ai aucune idée précise mais est-ce
    SET TERM ^;
    ou
    SET TERM ;^
    car tu utilises les deux formes !
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  3. #3
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 690
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 690
    Points : 13 120
    Points
    13 120
    Par défaut
    Les deux formes sont corrects. Le premier sert à définir ^ comme fin de commande, sinon il y aurait confusion avec le contenu du script lui-même et le deuxième remet le ; standard.

    Mais TIBQuery ne supportent pas de multiples commandes. Il faut utiliser à la place TIBScript et avec lui, SET TERM fonctionne.

    Citation Envoyé par ouiouioui Voir le message
    en plus écrire tout en dur est super long et galère à maintenir
    Il faudra bien le faire une fois
    Par contre un conseil; crée une table Version (une ligne, un champ), renomme ta procédure en CheckDBVersion et appelle-la systématiquement au lancement de ton programme. La première fois, sa créera ta base et les fois suivantes, controlera et appliquera les éventuelles mises à jour.

    Le principe (en gros):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    if not FileExists(...) then
    begin
      IBScript.Script.Text := 'create table ...;' #13
                             +'create table ...;' #13
                             +'commit work;' #13
                             +'insert into Version values (1.0);';
    end;
     
    if CheckVersion < 2.0 then
    begin
      IBScript.Script.Text := 'alter table ...;' #13
                             +'update Version set Ver=2.0;';
    end;

  4. #4
    Membre expérimenté
    Avatar de ouiouioui
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2006
    Messages
    984
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 984
    Points : 1 418
    Points
    1 418
    Par défaut
    Merci c'est parfait.

    Pour la version de la base j'y avais pas pensé, par contre la base est utilisé par plusieurs clients en même temps donc à l'inverse je pense plutôt que le numéro de version de base bloquera les clients pas à jour et seul l'admin mettra à jour la base.
    Il existe 3 sortes de gens: ceux qui savent compter et ceux qui ne savent pas.

  5. #5
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 690
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 690
    Points : 13 120
    Points
    13 120
    Par défaut
    Oui bien sûr (c'était clair que dans ma tête, désolé )
    Ce contrôle était fait chez moi par un Daemon installé sur un serveur (une machine) unique !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Connexion base de donnée avec un code C#
    Par yochima dans le forum C#
    Réponses: 12
    Dernier message: 20/05/2017, 19h12
  2. Base de donnée avec Code Blocks
    Par alias2015_29 dans le forum C++
    Réponses: 3
    Dernier message: 24/05/2015, 15h56
  3. Réponses: 19
    Dernier message: 04/04/2014, 09h26
  4. comment créer une base de donnée avec SQL3 sous SYBASE ASE 12.5
    Par aminelp dans le forum Adaptive Server Enterprise
    Réponses: 4
    Dernier message: 09/08/2009, 18h24
  5. Réponses: 4
    Dernier message: 21/01/2009, 16h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo