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 :

[ADO] Violation d'accès en utilisant EditConnectionString


Sujet :

Bases de données Delphi

  1. #1
    Membre du Club Avatar de Kephuro
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    61
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 61
    Points : 48
    Points
    48
    Par défaut [ADO] Violation d'accès en utilisant EditConnectionString
    Bonjour à tous !

    Je suis en train de coder une petite appli et dans certains cas j'ai besoin d'utiliser une chaine de connexion qui n'est pas définie à la base.
    J'ai vu qu'on pouvait utiliser une boite de dialogue similaire à celle que l'on peut avoir en utilisant l'inspecteur d'objet sur la propriété ConnectionString d'un TADOConnection.
    Pour celà il faut inclure AdoConEd dans les uses et appeller la methode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EditConnectionString(Component:TComponent):boolean
    Je me suis renseigné un peu et l'utilisation est plutôt simple. On passe un TADOconnection en paramètre de cette fonction et après la boite de dialogue apparait.

    Le souci c'est qu'en appelant cette méthode j'ai eu une EAccessViolation. Alors j'ai refait un petit bout de code pour épurer tout ce qui aurait pu gêner et je me retrouve avec la même erreur, voici ce petit bout de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure TfrmImport.Button2Click(Sender: TObject);
    Var
      aConn:TADOConnection;
    begin
      aConn:=TADOConnection.Create(nil);
      aConn.Connected:=false;
      if EditConnectionString(aConn) then
      begin
        ShowMessage(aConn.ConnectionString);
      end;
    end;
    A l'exécution du EditConnectionString j'ai donc une EAccessViolation.

    J'ai pas trouvé grand chose sur le net concernant cette erreur, juste un mec qui a eu le même problème sans réponse (2004) dans ce topic

    J'ai pas grand chose à ajouter, je vous remercie d'avance pour vos réponses et éclaircissements.
    Si vous avez besoin de plus d'informations, n'hésitez pas !

  2. #2
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Il ne faut pas que le composant AdoConnection soit créé avec la valeur nil, il lui faut absolument une form ou un datamodule de dépot.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    aConn:=TADOConnection.Create(Datamodule1);
    Je ne sais pas pourquoi c'est obligatoire, mais c'est nécessaire pour que cela fonctionne correctement.
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  3. #3
    Membre du Club Avatar de Kephuro
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    61
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 61
    Points : 48
    Points
    48
    Par défaut
    Merci Rayek, c'était bien ça. C'est embêtant du coup, j'utilisais ce code sur une unité sans form ni rien.
    Je vais me débrouiller, merci

  4. #4
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Citation Envoyé par Kephuro Voir le message
    Merci Rayek, c'était bien ça. C'est embêtant du coup, j'utilisais ce code sur une unité sans form ni rien.
    Je vais me débrouiller, merci
    Utilise un Datamodule, c'est fait pour les cas comme celui ci ^^
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  5. #5
    Membre du Club Avatar de Kephuro
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    61
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 61
    Points : 48
    Points
    48
    Par défaut
    Bizarrement ça n'a pas fonctionné avec un DataModule, m'y suis peut-être mal pris....
    Au final j'ai fait un peu le "barbare" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ConnexionADO:=TADOConnection.create(TComponent.create(nil))
    Et ça fonctionne

  6. #6
    Membre chevronné

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

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Euh là c'est même un peu trop barbare parce que là tu créé des TComponent qui ne seront jamais détruit => fuite de mémoire énorme.

    Fait au moins un truc du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    var
     UseLess: TComponent;
    begin
      UseLess := TComponent.Create( NIL );
      try
        ConnexionADO:=TADOConnection.create( UseLess );
        // truc à faire
     
      finally
        FreeAndNil( UseLess );
      end;
    end;
    Néanmoins je te conseillerais de quand même persévérer avec le DataModule parce que c'est la solution la plus propre.
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  7. #7
    Membre du Club Avatar de Kephuro
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    61
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 61
    Points : 48
    Points
    48
    Par défaut
    C'est une toute petite appli, mais bon, c'est vrai que ce n'est pas une raison pour négliger la consommation mémoire.

    Je débute, j'ai pas toujours le réflexe

    Pour le DataModule, j'ai pas besoin de poser "physiquement" un composant TADOConnexion ?
    Parce que si je créé juste le DataModule et que je l'inclus dans les uses, le fait de l'utiliser comme parent pour le TADOConnection me fait exactement la même erreur (EAccessViolation).

  8. #8
    Membre chevronné

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

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Est-ce que tu passe la variable globale représentant le DataModule créé comme paramètre du constructeur ? Es-tu sûr que cette variable est bien créé (regarder dans le code source du DPR, attention si l'instanciation se fait après la création de la fiche principale mais que ton traitement est dans le OnCreate ou le OnShow de la fiche alors effectivement la variable globale n'est pas créé tu dois déplacer son instanciation avant celle de ta fiche).
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

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

Discussions similaires

  1. Violation d'accès en utilisant Open
    Par Djelangelo dans le forum Bases de données
    Réponses: 6
    Dernier message: 17/11/2010, 08h02
  2. Réponses: 2
    Dernier message: 28/04/2010, 18h59
  3. Réponses: 4
    Dernier message: 16/10/2008, 18h55
  4. Réponses: 4
    Dernier message: 29/07/2008, 13h52
  5. BCB 6 / Violation d'accès après utilisation d'une DLL
    Par a_lincoln54 dans le forum C++Builder
    Réponses: 1
    Dernier message: 28/04/2008, 14h15

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