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 :

Base Firebird en "ShutDown"


Sujet :

Bases de données Delphi

  1. #1
    Membre confirmé
    Avatar de JP.NUAGE
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    769
    Détails du profil
    Informations personnelles :
    Âge : 81
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 769
    Points : 542
    Points
    542
    Par défaut Base Firebird en "ShutDown"
    à tous

    Voilà le code, fait dans une petite application de test
    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
    procedure TForm1.FormShow(Sender: TObject);
    var Cmde, params, Chemin1, Chemin2 : string;
    begin
       Chemin1 := 'C:\SAUVEGARDES\ESSAI.fbk';
       Chemin2 := 'C:\BASES\ESSAI.FDB';
       Cmde := 'C:\Program Files\Firebird\Firebird_2_1\bin\gbak.exe';
       params:=Format('-rep -l -g -user SYSDBA -password ' +
       ZConnection.Password +' %s %s',[Chemin1, Chemin2]);
     
       ZConnection.Connected := false;
       ZConnection.Database := '';
       ShellExecute(0,'open',Pchar(cmde),Pchar(params),nil,SW_HIDE);
       ZConnection.Database := Chemin2;
       ZConnection.Connected := true;   <=======
       ZReadOnlyQuery1.Active := true;
    end;
    La restauration se fait correctement, mais l'ordre pointé envoie un message disant que la base est "shutdown". Si je sors de l'appli, la base est bien accessible et je vois que la restauration a été faite correctement.
    D'où vient ce problème
    Ce qui se conçoit bien s'énonce clairement
    Et les mots pour le dire viennent aisément (Boileau)

  2. #2
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut

    L'appel de ShellExecute étant asynchrone, la reconnexion à la BDD est demandée alors que le restore est toujours en exécution.
    Ce qui expliquerait peut-être ce statut "shutdown".

    Utilise plutôt CreateProcess et WaitForSingleObject.

    Tiens nous au courant.

    @+ Claudius.

  3. #3
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  4. #4
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Un compo service IBX avec firebird 2.1.
    Cela me semble un mauvaise idée.

  5. #5
    Membre confirmé
    Avatar de JP.NUAGE
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    769
    Détails du profil
    Informations personnelles :
    Âge : 81
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 769
    Points : 542
    Points
    542
    Par défaut
    J'ai aussi essayé avec un CreateProcess. Voici le code. Ce sont les mêmes chemins pour gbak, la sauvegarde et la base que dans le ShellExecute.
    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
    {ceci est dans un procédure}
    Prg :=' C:\Program Files\Firebird\Firebird_2_1\bin\gbak.exe';
    Params := '-rep -l -g -user SYSDBA -password masterkey C:\SAUVEGARDES\ESSAI.fbk C:\BASES\ESSAI.FDB';
    Restauration (Prg,Params);
     
    end;
     
    procedure TForm1.Restauration(Prg : TFileName; Params : string);
    var
      StartupInfo: TStartupinfo;
      ProcessInfo: TProcessInformation;
      e : integer;
    begin
     
      FillChar(Startupinfo,Sizeof(TStartupinfo),0);
      Startupinfo.cb:=Sizeof(TStartupInfo);
      if CreateProcess(nil,PChar(Prg),nil,nil,false,normal_priority_class,nil,
                       PChar(Params),Startupinfo,ProcessInfo) then
      begin
        WaitforSingleObject(Processinfo.hProcess, infinite);
        CloseHandle(ProcessInfo.hProcess);
      end
      else
         begin
         e:=getlasterror();
         ShowMessage(IntToStr(e));
         end;   
    end;
    je recois 267 par le ShowMessage, et bien sûr pas de restauration. J'ai vérifié les chemins, allant jusqu'à les copier à partir de l'explorateur. Je ne vois pas pourquoi il me dit erreur de directory (267)
    Ce qui se conçoit bien s'énonce clairement
    Et les mots pour le dire viennent aisément (Boileau)

  6. #6
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    Citation Envoyé par Cl@udius Voir le message
    Un compo service IBX avec firebird 2.1.
    Cela me semble un mauvaise idée.
    pas obligatoire, mais sa marche bien, on peu bien sûr passé par les UIB
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  7. #7
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 101
    Points
    19 101
    Par défaut
    Citation Envoyé par Cl@udius Voir le message
    Un compo service IBX avec firebird 2.1.
    Cela me semble un mauvaise idée.
    Pourquoi ? Le service n'est pas lié au compo, le composant ne fait que demander l'exécution du service sur le serveur. C'est bien le service de Firebird qui est exécuté (j'en ai eut la preuve hier)
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

  8. #8
    Membre confirmé
    Avatar de JP.NUAGE
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    769
    Détails du profil
    Informations personnelles :
    Âge : 81
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 769
    Points : 542
    Points
    542
    Par défaut
    Cité par edam
    je préfère tibrestoreservice
    Vous allez rire, c'est justement parce que cette solution en fonctionne pas (ni en sauvegarde ni en restauration) que je suis passé par ShellExecute, qui fonctionne parfaitement en sauvegarde. Maintenant, Cl@udius a certainement raison sur l'origine du shutdown, vue que si je quitte l'appli, la base est accessible. Toutefois, ceci n'explique pas le code 267 que je récolte avec le CreateProcess

    Et en effet, je viens de faire l'essai : si je mets un Timer avec une durée assez longue, plus de shutdown, mais avec le ShellExecute
    Ce qui se conçoit bien s'énonce clairement
    Et les mots pour le dire viennent aisément (Boileau)

  9. #9
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 288
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 288
    Points : 1 936
    Points
    1 936
    Par défaut
    Pour CreateProcess tu as les paramètres en tant que WorkingDirectory.
    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
     
    procedure TForm1.Restauration(Prg : TFileName; Params : string);
    var
      StartupInfo: TStartupinfo;
      ProcessInfo: TProcessInformation;
      e : integer;
    begin
     
      FillChar(Startupinfo,Sizeof(TStartupinfo),0);
      Startupinfo.cb:=Sizeof(TStartupInfo);
      if CreateProcess(nil,PChar(Prg+Params),nil,nil,false,normal_priority_class,nil,
                       nil,Startupinfo,ProcessInfo) then
      begin
        WaitforSingleObject(Processinfo.hProcess, infinite);
        CloseHandle(ProcessInfo.hProcess);
      end
      else
         begin
         e:=getlasterror();
         ShowMessage(IntToStr(e));
         end;   
    end;
    testé avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Prg :='notepad.exe';
    Params := ' d:\test.txt';
    Delphi 7/XE2/XE3
    C#
    Oracle 9i à 12c
    SQL Server 2008 à 2014

  10. #10
    Membre confirmé
    Avatar de JP.NUAGE
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    769
    Détails du profil
    Informations personnelles :
    Âge : 81
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 769
    Points : 542
    Points
    542
    Par défaut
    Merci Linkin, ta solution fonctionne à la perfection dans le test. Maintenant, j'ai repris le même code dans le programme réel, et je rencontre un autre soucis.

    Ma base est dans un DataModule, donc l'ordre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Zconnection1.Connected := false;
    est devenu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonDataModule.MaZconnection.connected := false;
    et là, j'ai un plantage par violation d'adresse !
    Ce qui se conçoit bien s'énonce clairement
    Et les mots pour le dire viennent aisément (Boileau)

  11. #11
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 288
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 288
    Points : 1 936
    Points
    1 936
    Par défaut
    Dans le dpr, le Datamodule doit sûrement être créé après la Form principale.
    Delphi 7/XE2/XE3
    C#
    Oracle 9i à 12c
    SQL Server 2008 à 2014

  12. #12
    Membre confirmé
    Avatar de JP.NUAGE
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    769
    Détails du profil
    Informations personnelles :
    Âge : 81
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 769
    Points : 542
    Points
    542
    Par défaut
    Non, c'est la datamodule qui est créé en premier
    Ce qui se conçoit bien s'énonce clairement
    Et les mots pour le dire viennent aisément (Boileau)

  13. #13
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 288
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 288
    Points : 1 936
    Points
    1 936
    Par défaut
    Mon aide s'arrête donc là. Je ne connais pas les composants Zeos.

    A tout hasard, violation d'accès à l'adresse 0, ou à une autre adresse?
    Delphi 7/XE2/XE3
    C#
    Oracle 9i à 12c
    SQL Server 2008 à 2014

  14. #14
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 101
    Points
    19 101
    Par défaut
    Mets tout de même deux points d'arrêt, un dans le dpr sur la création du datamodule et un sur la ligne qui plante.
    Vérifie que tu passes bien par le datamodule en premier, j'ai déjà eut des surprises comme cela : les sections initialization sont appelée bien avant tout cela et appeléait indirectement des évènement...
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

  15. #15
    Membre confirmé
    Avatar de JP.NUAGE
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    769
    Détails du profil
    Informations personnelles :
    Âge : 81
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 769
    Points : 542
    Points
    542
    Par défaut
    Réponse à Non40 : pas la peine. Je suis sûr de la création du DataModule, pour un raison bien simple : je rentre dans l'appli. La restauration est obtenue à partir d'un menu. Donc le Datamodule est créé, sinon, la fenêtre affichant le menu ne viendrait pas !

    Voilà le code du dpr :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    begin
      Application.Initialize;
      Application.CreateForm(TFRM_DM_DOSS_COM, FRM_DM_DOSS_COM);
      if FRM_DM_DOSS_COM.ConnecteBDD then begin  <=== là le datamodule est bien créé
         Application.CreateForm(TDM_ICONES, DM_ICONES);
         Application.CreateForm(TFRM_Accueuil, FRM_Accueuil);  <=== là est le menu
    ....
    end;
    Ce qui se conçoit bien s'énonce clairement
    Et les mots pour le dire viennent aisément (Boileau)

  16. #16
    Membre confirmé
    Avatar de JP.NUAGE
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    769
    Détails du profil
    Informations personnelles :
    Âge : 81
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 769
    Points : 542
    Points
    542
    Par défaut
    C'est à n'y rien comprendre. C'est le feuilleton de l'année. J'ai donc un programme de test où la restauration fonctionne très bien. Après l'erreur signalée plus haut, j'ai déplacé , dans l'appli réelle, le module de restauration
    dans le Datamodule. De ce fait, plus d'erreur lors de la déconnection de la base et de la mise à blanc du paramètre DataBase. Mais maintenant il ne restaure plus rien et me balance
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ERROR_RESOURCE_TYPE_NOT_FOUND
     
        1813 (0x715)
     
        The specified resource type cannot be found in the image file.
    J'ai bien contrôlé que j'avais les mêmes uses et les mêmes paramètres que dans le programme de text
    Ce qui se conçoit bien s'énonce clairement
    Et les mots pour le dire viennent aisément (Boileau)

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

Discussions similaires

  1. liste objet d'une base firebird
    Par fbalien dans le forum Bases de données
    Réponses: 3
    Dernier message: 11/11/2004, 22h40
  2. Refus d'accès à une base Firebird
    Par severine dans le forum Installation
    Réponses: 18
    Dernier message: 04/06/2003, 16h03

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