Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Erreur de définition d'une variable globale

3 réponses
Avatar
DELVA Michael
Bonjour à tous,

voici mon problème:

j'ai la classe suivante:

//Query.h
namespace MVS
{
namespace DB
{
extern AnsiString mvsDBConnectionString;

class PACKAGE Query
{
protected:
TADOQuery * adoQuery;

Query();
~Query();
public:
void ChangeSQL(const AnsiString & query);
};
}
}

//Query.cpp
namespace MVS
{
namespace DB
{

AnsiString mvsDBConnectionString = "";

//-----------------------------------------------------------------
Query::Query()
{
assert(mvsDBConnectionString != "");

adoQuery = new TADOQuery(NULL);
adoQuery->ConnectionString = mvsDBConnectionString;
}

}
}


Ce que je veux faire, c'est renseigner dans un fichier de mon application
qui utilise la classe précédente la variable mvsDBConnectionString afin
que la classe Query puisse se connecter à la base de données.

A la première ligne du main j'ai donc ajouté la ligne:

MVS::DB::mvsDBConnectionString = "Provider=MSDASQL.1;...";

Mais le lieur me donne l'erreur suivante:

[ILINK32 Erreur] Error: 'MVS::DB::mvsDBConnectionString' externe non
rÚsolu, rÚfÚrencÚ depuis D:\MES DOCUMENTS\RAD STUDIO\PROJETS\TESTS\TEST
DBBOX\DEBUG\PROJECT1.OBJ

Une solution serait d'utiliser une classe Singleton qui serait utilisée
par la classe Query pour se connecter comme il faut, mais je voudrais
savoir si une autre solution est envisageable.

Merci d'avance

Mike

3 réponses

Avatar
Sylvain
DELVA Michael wrote on 08/09/2007 14:27:

namespace MVS {
namespace DB {
extern AnsiString mvsDBConnectionString;

class PACKAGE Query {
protected:
TADOQuery * adoQuery;


ça existe encore ADO ??
je l'utilisais à sa sortie (il y a 10 ans non?)
depuis je préfère largement les solutions non propriétaires.


Query();
~Query();
public:
void ChangeSQL(const AnsiString & query);
};
}
}

//Query.cpp
namespace MVS {
namespace DB {
AnsiString mvsDBConnectionString = "";
[...]

Ce que je veux faire, c'est renseigner dans un fichier de mon application
qui utilise la classe précédente la variable mvsDBConnectionString afin
que la classe Query puisse se connecter à la base de données.


le constructeur de Query peut servir à cela (ie recevoir un ref. const).

Une solution serait d'utiliser une classe Singleton qui serait utilisée
par la classe Query pour se connecter comme il faut, mais je voudrais
savoir si une autre solution est envisageable.


une classe Requete indépendante d'une connexion à une base est,
nécessairement, incomplète.
votre choix de récupérer une chaine de connexion via une globale créera
surement une rebondance sur le code d'établissement de la connexion.
une solution serait de disposer d'une classe gérant la connexion
elle-même et d'initialiser la classe Requete avec une instance
connexion, on encore que la classe connexion serve de factory à des
instances de requetes; en hiérarchisant ces classes, et en définissant
leur relation, votre besoin de globales externes disparaitra surement.

Sylvain.

Avatar
Jean-Marc Bourguet
DELVA Michael writes:

//Query.h
namespace MVS
{
namespace DB
{
extern AnsiString mvsDBConnectionString;
}
}

//Query.cpp
namespace MVS
{
namespace DB
{

AnsiString mvsDBConnectionString = "";
}
}


A la première ligne du main j'ai donc ajouté la ligne:

MVS::DB::mvsDBConnectionString = "Provider=MSDASQL.1;...";

Mais le lieur me donne l'erreur suivante:

[ILINK32 Erreur] Error: 'MVS::DB::mvsDBConnectionString' externe non
rÚsolu, rÚfÚrencÚ depuis D:MES DOCUMENTSRAD STUDIOPROJETSTESTSTEST
DBBOXDEBUGPROJECT1.OBJ


Je ne vois pas de problèmes. Si tu as vérifié que ce n'est pas une typo,
tu peux construire un exemple minimal (en gros, ce que j'ai laissé devrait
suffire, commence meme par changer le type de la variable).

Sinon comme Sylvain j'aurais tendance à séparer la connection de la
requête.

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
DELVA Michael
ça existe encore ADO ??
je l'utilisais à sa sortie (il y a 10 ans non?)
depuis je préfère largement les solutions non propriétaires.



Voui ^^ C'est ce avec quoi j'ai commencé quand je devais m'attaquer aux
base de données. J'ai découvert une solution autre récemment, et je vais
l'utiliser dans le futur à la place d'ADO...

une classe Requete indépendante d'une connexion à une base est,
nécessairement, incomplète.
votre choix de récupérer une chaine de connexion via une globale
créera surement une rebondance sur le code d'établissement de la
connexion. une solution serait de disposer d'une classe gérant la
connexion elle-même et d'initialiser la classe Requete avec une
instance connexion, on encore que la classe connexion serve de factory
à des instances de requetes; en hiérarchisant ces classes, et en
définissant leur relation, votre besoin de globales externes
disparaitra surement.


C'est une idée que je comptais développer plus tard avec la solution dont
je viens de faire connaissance...

Quelque chose me dit que je vais m'attaquer à ça un peu plus tôt que prévu
;)

Merci pour le conseil

Mike