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 :

[EOleException] Destroy sur un objet TADOConnection


Sujet :

Bases de données Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Leoxp
    Invité(e)
    Par défaut [EOleException] Destroy sur un objet TADOConnection
    Salut à tous

    J'écris sur ce forum car je rencontre un souci dans le développement d'une application sous Delphi 7.

    Il s'agit d'une application de gestion de données, autour d'une base de données Access 2003. Je fais la liaison entre l'appli et la base de données via une classe que j'ai créé. Cette classe utilise un objet TADOConnection que j'initialise au lancement de l'application :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Application.Initialize;
    connectBD:=TADOConnection.Create(connectBD);
    cheminBD:=ExtractFilePath(Application.ExeName) + 'BAL.mdb';
    chaineCnx:='Provider=Microsoft.Jet.OLEDB.4.0;' +
                   'User ID=Admin;' +
                   'Data Source=' + cheminBD + ';' +
                   'Mode=Share Deny None;Extended Properties="";' +
                   'Jet OLEDB:Engine Type=5;';
    connectBD.ConnectionString:=chaineCnx;
    connectBD.LoginPrompt:=false;
    connectBD.Connected:=true;
    Durant toute la durée de vie de l'application, je fais des appels de données via des fonctions de ce type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function TBD_BAL.listeClasses : TADOQuery;
    begin
        Result:=Query('select * from niveaux order by nom');
    end;
    ou de ce type là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      function TBD_BAL.supprimerLivre(isbn : string) : boolean;
    begin
        Result:=execQuery('delete from livres where isbn=''' + isbn + '''');
    end;
    Dans tous les cas, c'est les fonctions "Query" et "execQuery" qui sont chargées de faire le lien avec la base de données :

    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
      function TBD_BAL.Query(rsql : string) : TADOQuery;
      begin
        Result:=nil;
        Result:=TADOQuery.Create(Result);
        With Result Do
        Begin
          Close;
          Connection:=connectBD;
          SQL.Clear;
          SQL.Add(rsql);
          Prepared:=true;
          Open;
        End;
      end;
     
      function TBD_BAL.execQuery(rsql : string) : boolean;
      var
        Q : TADOQuery;
        i : integer;
      begin
        Q:=nil;
        Q:=TADOQuery.Create(Q);
        With Q Do
        Begin
          Close;
          Connection:=connectBD;
          SQL.Clear;
          SQL.Add(rsql);
          Prepared:=true;
          i:=execSQL;
        End;
        Q.Free;
        If i=0 Then Result:=false else Result:=true;
      end;
    Lorsque le programme est fermé, j'appel une fonction qui se charge de fermer la base de données et de libérer l'espace utilisé par les objets en mémoire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      destructor TBD_BAL.fermer;
      begin
         connectBD.Connected:=false;
         connectBD.Close;
         connectBD.ConnectionString:='';
         connectBD.Free;
      end;

    Voilà, je sais que ça fait un peu pagaille de tout pondre comme ça sur le forum, mais c'est histoire que vous ayez toutes les données.

    J'en arrive maintenant au problème : lorsque je ferme l'application, on me renvoi l'erreur :

    Impossible de modifier la propriété ActiveConnection d'un objet Recordset avec un objet Command comme source
    Grâce au pas à pas, je sais qu'il s'agit d'une exception de type EOleException, et qu'elle se produit au moment ou je fais appel à la commande :

    Savez-vous d'où viens l'erreur ? N'étant pas un expert de l'utilisation des objets ADODB, j'ai fait un peu comme j'ai pu en lisant les tutoriels, mais j'ai l'impression d'avoir un peu développé ça à l'arrache...


  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    sans regarder le reste du code il y a quelque chose qui ne me va pas (dès la seconde ligne en fait )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    connectBD:=TADOConnection.Create(connectBD);
    Erreur, tu dis au composant d'être son propre owner ça va clairement pas aller. Par ailleurs je crois me souvenir qu'il est impératif que le TADOConnection soit créé avec un Owner existant donc vu ton code je te conseilles ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    connectBD:=TADOConnection.Create(Application);
    Et en plus tu n'as même pas besoin de faire un Free sur ton TADOConnection comme ceci puisqu'avec Application comme Owner il sera détruit dès que l'application se terminera. Par contre je te conseilles de faire quand même un Close de la connexion, pour être propre, au moment de la fermeture de l'application.

  3. #3
    Leoxp
    Invité(e)
    Par défaut
    Arg ! Autant pour moi !

    C'est vrai que je n'ai jamais cherché à savoir comment utiliser cette fonction Create. Je vais aller me documenter un peu et voir si le problème venait de là (il y a des chances visiblement).

    Merci beaucoup à toi Aka Guymelef

  4. #4
    Leoxp
    Invité(e)
    Par défaut
    Zut ! Le problème persiste !

    Visiblement ça ne venait pas de là (même si c'était tout de même une erreur à corriger )

    Je vais continuer à chercher, mais si quelqu'un à une idée, je suis preneur car ça fait bien une semaine que je bosse la dessus...

  5. #5
    Membre Expert

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Billets dans le blog
    1
    Par défaut
    Fait attention que tu as fait la même erreur au niveau de la création de tes TADOQuery.

  6. #6
    Leoxp
    Invité(e)
    Par défaut
    Oui J'ai bien tout revérifié dans mes différentes unités. Mais aucun changement !

    Ce n'est qu'en arrivant ce matin que, lorsque j'ai recompilé, ça m'a mis une autre erreur (sur un timer). Donc je vais exploiter tout ça et si tout est bon, ça sera super

Discussions similaires

  1. vector de pointeurs sur des objet
    Par jean-bobby dans le forum SL & STL
    Réponses: 26
    Dernier message: 06/08/2004, 14h54
  2. question de débutant sur les objets
    Par boucher_emilie dans le forum ASP
    Réponses: 3
    Dernier message: 06/08/2004, 10h51
  3. pointeur multiple sur un objet
    Par Arnaud-h dans le forum C++Builder
    Réponses: 9
    Dernier message: 02/06/2004, 11h33
  4. [debutant] Contraintes d'intégrité définies sur un objet
    Par maysa dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 25/05/2004, 14h57
  5. Requêtes : recherche de maxi sur plusieur Objet
    Par pertuis dans le forum Langage SQL
    Réponses: 6
    Dernier message: 08/03/2004, 15h28

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