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] [DLL] Impossible de créer la connexion...


Sujet :

Bases de données Delphi

  1. #1
    Membre régulier
    Homme Profil pro
    Chef de projet
    Inscrit en
    Juin 2004
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 101
    Points : 122
    Points
    122
    Par défaut [ADO] [DLL] Impossible de créer la connexion...
    Bonjour,

    J'essaie de créer une DLL qui accède à une DB MS-SQL via ADO.

    La commande AdoCnx := TAdoConnection.Create(Composant); me renvoie l'erreur suivante :
    Classe d'exception : EOloSysError.
    Message : CoInitialize n'a pas été appelé

    C'est surement une erreur de débutant, mais ça fait 2 jours que je bloque la-dessus...

    Si une bonne âme pouvait m'aider... Merci !

    Voici le code complet de ma DLL:
    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
    library AdoDll;
    uses
      ShareMem, SysUtils, Classes,
      ADODB, ComObj;
    {$R *.res}
    Type
      TComposants = Class(TComponent);
    Var
      Composant : TComposants;
      AdoCnx : TAdoConnection;
     
    Function CnxAvail:Boolean; StdCall ;
    //----------------------------------------------------------------------------
    // Retourne VRAI si la connexion est possible
    //----------------------------------------------------------------------------
    Var
     Resultat : Boolean;
     CnxStr   : String;
    Begin
      // Cette ligne me renvoie l'erreur suivante :
      //  Classe d'exception EOloSysError. Message : CoInitialize n'a pas été appelé
      AdoCnx := TAdoConnection.Create(Composant);
     
      CnxStr := 'Provider=SQLOLEDB.1;Persist Security Info=True;User ID=sa;'+
                'Initial Catalog=MyDb;Data Source=MySrv;Password=MyPassword';
      AdoCnx.LoginPrompt := False;
      AdoCnx.CursorLocation := clUseClient;
      Try
        AdoCnx.Connected := True;
      Finally
        Resultat := AdoCnx.Connected;
      End;
      CnxAvail := Resultat;
    End;
    //----------------------------------------------------------------------------
    Exports CnxAvail;
    //----------------------------------------------------------------------------
    begin
     
    end.
    //----------------------------------------------------------------------------

  2. #2
    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 : 57
    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 104
    Points
    19 104
    Par défaut
    Heu c'est quoi le truc .Create(Composant); alors que Composant est défiini comme un metaclasse et non initialisé

    Vir ta définition de TComposant qui ne sert à rien.

    Puis fait .Create(Nil) , par contre il faudra penser à libérer le composant toi-même avant la fermeture du programme.

  3. #3
    Membre régulier
    Homme Profil pro
    Chef de projet
    Inscrit en
    Juin 2004
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 101
    Points : 122
    Points
    122
    Par défaut
    Voici la nouvelle version de mon code, tenant compte de tes remarques.
    Le résultat est identique : Même msg d'erreur au même endroit...
    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
    library AdoDll;
    uses 
      ShareMem, SysUtils, Classes, 
      ADODB, ComObj; 
    {$R *.res} 
    Var
      AdoCnx : TAdoConnection;
     
    Function CnxAvail:Boolean; StdCall ;
    //----------------------------------------------------------------------------
    // Retourne VRAI si la connexion est possible
    //----------------------------------------------------------------------------
    Var
     Resultat : Boolean;
     CnxStr   : String;
    Begin
      // Cette ligne me renvoie l'erreur suivante :
      //  Classe d'exception EOloSysError. Message : CoInitialize n'a pas été appelé
      AdoCnx := TAdoConnection.Create(nil);
     
      CnxStr := 'Provider=SQLOLEDB.1;Persist Security Info=True;User ID=sa;'+
                'Initial Catalog=MyDb;Data Source=MySrv;Password=MyPassword';
      AdoCnx.LoginPrompt := False;
      AdoCnx.CursorLocation := clUseClient;
      Try
        AdoCnx.Connected := True;
      Finally
        Resultat := AdoCnx.Connected;
      End;
      CnxAvail := Resultat;
      AdoCnx.Free;
    End;
    //----------------------------------------------------------------------------
    Exports CnxAvail;
    //----------------------------------------------------------------------------
    begin
     
    end.
    //----------------------------------------------------------------------------

  4. #4
    Membre régulier
    Homme Profil pro
    Chef de projet
    Inscrit en
    Juin 2004
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 101
    Points : 122
    Points
    122
    Par défaut
    Je n'avance pas d'un poils !

    Je pense que le pb vient du fait qu'il s'agit d'une DLL (library) et non d'une application (program).
    Il manque certainement une initialisation quelque part, mais où ???

  5. #5
    Membre du Club
    Inscrit en
    Avril 2004
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 37
    Points : 42
    Points
    42
    Par défaut
    salut,
    comme çà à vue de pif
    çà serait pas mal d'affecter ta chaine de connexion au composant Tadoconnection, de plus faire çà dans une lib te sert à rien
    tu n'utilises que des composants delphi...crée une unité DataModule dans ton appli! c'est fait pour! ta connection sera partagée entre tes différentes unités en utilisant la clause uses....

    sinon tu as un pb de "connectionString" genre(par ex)
    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
     
     Resultat : Boolean;
     CnxStr   : String;
    Begin
      // Cette ligne me renvoie l'erreur suivante :
      //  Classe d'exception EOloSysError. Message : CoInitialize n'a pas été appelé
      AdoCnx := TAdoConnection.Create(nil);
     
      CnxStr := 'Provider=SQLOLEDB.1;Persist Security Info=True;User ID=sa;'+
                'Initial Catalog=MyDb;Data Source=MySrv;Password=MyPassword';
     
     AdoCnx.ConnectionString:= CnxStr;
     AdoCnx.LoginPrompt := False;
      AdoCnx.CursorLocation := clUseClient;
      Try
        AdoCnx.Connected := True;
      Finally
        Result := AdoCnx.Connected;
        CnxAvail := Result;
       AdoCnx.Free
      End;
    End;
    sinon je comprends rien à ton code
    tu crées une connection pour la supprimer tout de suite après sans
    l'affecter à un autre tadocomponent? mystere
    un bon et tuto sur l'ado t'aiderais je crois...
    http://delphi.developpez.com/cours/#sgbd
    a+ 8)

  6. #6
    Membre régulier
    Homme Profil pro
    Chef de projet
    Inscrit en
    Juin 2004
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 101
    Points : 122
    Points
    122
    Par défaut
    Citation Envoyé par mandale
    salut,
    comme çà à vue de pif
    çà serait pas mal d'affecter ta chaine de connexion au composant Tadoconnection,
    C'est ce que fais avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AdoCnx.ConnectionString:= CnxStr;
    [Edit Le Lézard 13/09/04] Oups !!! J'ai lu trop vite (ou écrit trop vite)... Dans le code que j'ai posté, j'avais effectivement oublié d'affecter la chaîne de connexion à mon composant TADOConnection... Mea culpa


    Citation Envoyé par mandale
    de plus faire çà dans une lib te sert à rien
    tu n'utilises que des composants delphi...crée une unité DataModule dans ton appli! c'est fait pour! ta connection sera partagée entre tes différentes unités en utilisant la clause uses....
    Et bien justement, c'est que veux faire ça dans une DLL, et ce, pour plusieurs raisons :
    - Mon projet est de réaliser une dll qui intégrera des fonctions de reporting avancées sur une base de donnée assez complexe. Plusieurs modules (applications) du projet utiliseront ces fonctions, et ce sont uniquement ces fonctions qui sont succeptibles d'évoluer dans le temps. Si je suis ton principe d'unité, je serais obligé de recompiler l'ensemble des applications de mon projet, puis ensuite les déployer... Avec une dll, seule celle-ci devra être recompilée/déployée
    - Mon projet est assez volumineux, et dans un souci d'optimisation du temps de développement, les différent modules qui le composent sont et/ou seront développer avec le langage le plus adequat (pour certains, je privilégie la performance du code compilé, pour d'autres je recherche la facilité de créer une interface graphique lookée "dernier cri")

    Citation Envoyé par mandale
    sinon tu as un pb de "connectionString" genre(par ex)
    sinon je comprends rien à ton code
    tu crées une connection pour la supprimer tout de suite après sans
    l'affecter à un autre tadocomponent? mystere
    J'ai justement fait un code simple (spécifiquement pour le poster ici) qui met en évidence le problème. La totalité du code de la dll est en haut de ce sujet.
    Cette dll n'a qu'une seule fonction publiée : CnxAvail qui renvoie VRAI si la dll peut établir la connexion avec la database et faux en cas d'échec. C'est donc pour ça que je cré la connexion, que je la teste, et que je la détruit pour enfin ne retourner que le résultat du test (VRAI ou FAUX).
    Le problème survient à l'exécution sur la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AdoCnx := TAdoConnection.Create(nil);
    Le message d'erreur est :
    Classe d'exception EOloSysError. Message : CoInitialize n'a pas été appelé


    Citation Envoyé par mandale
    un bon et tuto sur l'ado t'aiderais je crois...
    http://delphi.developpez.com/cours/#sgbd
    a+ 8)
    J'ai bien évidemment longuement utilisé la touche F1, parcouru les tutos du site, et planché plusieurs heures avant de posté ce sujet...

    J'ai fait tourner cette fonction sans problème dans une application.
    Le problème que je rencontre ne vient peut-etre pas d'ADO, mais plutot que l'hote soit une dll...

    J'espère être assez clair dans mes explications...

  7. #7
    Membre émérite
    Avatar de NoisetteProd
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    1 905
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 905
    Points : 2 614
    Points
    2 614
    Par défaut
    Salut !

    Le problème a déjà été rencontrer lors de l'utilisation d'ADO dans un service voir ce sujet

    J'avais trouvé deux solutions pour le service, teste le pour ta DLL:
    mettre en premier dans le ServiceStart Code:
    application.Initialize;

    mettre en premier dans le ServiceStart Code:
    CoInitialize(nil);

    Voilà, tu auras besoin de rajouter ActiveX dans les uses.

    Teste et dis nous si ca t'aide

  8. #8
    Membre régulier
    Homme Profil pro
    Chef de projet
    Inscrit en
    Juin 2004
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 101
    Points : 122
    Points
    122
    Par défaut
    Merci NoisetteProd,

    La 2ème solution fonctionne.

    Et pour ceux que ça intéresse, voici le code complet de ma DLL.
    Pour l'instant, une seule fonction est publiée : CnxAvail
    Cette fonction renvoie "VRAI" si la connexion fonctionne, et "FAUX" si elle échoue (quelle qu'en soit la raison).
    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
     
    library AdoDll;
    uses
      SysUtils,
      Dialogs,
      ADODB,
      ComObj,
      ActiveX;
     
    {$R *.res}
     
    Function CnxAvail:Boolean; StdCall ;
    //----------------------------------------------------------------------------
    // Retourne VRAI si la connexion est possible
    //----------------------------------------------------------------------------
    Var
     CnxStr,
     MessageE : String;
     AdoCnx   : TAdoConnection;
    Begin
      coInitialize(nil);
      AdoCnx := TAdoConnection.Create(nil);
      With AdoCnx do Begin
         CnxStr := 'Provider=SQLOLEDB.1;Password=MyPassword;Persist Security Info=False;'+
                   'User ID=MyLogin;Initial Catalog=MyDatabase;Data Source=MyServer';
         ConnectionString := CnxStr;
         LoginPrompt := false;
         CursorLocation := clUseClient;
         Try
           Connected := True;
         Except
           On E:EOleException do Begin
                 MessageE := E.Message;
                 Showmessage(MessageE);
           End;
         End;
         CnxAvail := Connected;
      end;
      AdoCnx.Free;
    End;
    //----------------------------------------------------------------------------
    Exports CnxAvail;
    //----------------------------------------------------------------------------
    begin
     
    end.
    Il suffisait s'ajouter la ligne coInitialize(nil) (et l'unité ActiveX).

    Maintenant, YAPLUKA...

    Le Lézard.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 16/04/2014, 11h23
  2. [MySQL] Impossible de créer un objet de connexion à ma BD (erreur 500)
    Par beegees dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 31/07/2013, 09h34
  3. SQL SERVER 2008 Impossible de créer une nouvelle connexion
    Par LhIaScZkTer dans le forum Administration
    Réponses: 7
    Dernier message: 10/12/2010, 11h40
  4. [Admin] [BO XI] Impossible de créer ou modifier une connexion partagée
    Par Jodie dans le forum Administration-Migration
    Réponses: 3
    Dernier message: 02/11/2010, 14h21
  5. Impossible de créer une connexion filaire sur un routeur Linksys
    Par Pierre Fauconnier dans le forum Hardware
    Réponses: 13
    Dernier message: 07/01/2009, 15h52

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