Bonjour,

Je travaille actuellement sous C++ Builder 5 et essaie d'implémenter une classe qui me permettra de me connecter à différentes bases de données pour les besoin de l'application que je réalise.
J'ai fait le choix d'une classe statique, à savoir que l'ensemble des attributs et méthodes sont statiques.

Mon premier problème est que j'obtiens les messages suivants à la compilation :
[Lieur Erreur] Unresolved external 'Database::cnnSQLBIF' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER5\PROJECTS\DATABASE.OBJ
[Lieur Erreur] Unresolved external 'Database::cnnSQLData' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER5\PROJECTS\DATABASE.OBJ
J'ai vérifié plusieurs fois si je n'avais pas oublié un petit quelque chose et, à première vue, il me semble que non.

Mon deuxième problème est le fait que lorsque je veux instancier mon objet TADOConnection, je suis censé faire :
cnnMDB = new TADOConnection(this);
J'obtiens alors le message suivant :
[C++ Erreur] Database.cpp(23): E2297 'this' ne peut être utilisé que dans une fonction membre
Je comprends pourquoi le compilateur me signale cette erreur (c'est logique, vu que c'est du statique, le pointeur this ne fait référence à rien), je ne peux donc pas faire ça.
Mais alors, comment dois-je procéder ? Suis-je obligé de faire de cette façon ? Y a-t-il une alternative ?

Voici le code pour mieux comprendre et visualiser :

Database.h :
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
 
#ifndef DatabaseH
#define DatabaseH
 
#include <ADODB.hpp>
 
class Database
{
   private:
        static TADOConnection *cnnMDB;
        static TADOConnection *cnnSQLBIF;
        static TADOConnection *cnnSQLData;
   public:
        static bool __fastcall openMDBConnection(String dbName);
        static bool __fastcall openSQLConnection(bool bForBif, String userName, String pw, String serverNamedPipe, String serverAddress, String serverCustom, String dbName);
        static bool __fastcall openSQLConnections(String userName, String pw, String serverNamedPipe, String serverAddress, String serverCustom, String BIFDBName, String DataDBName);
 
};
#endif
Database.cpp :
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
 
#include <vcl.h>
#pragma hdrstop
 
#include "Database.h"
 
bool __fastcall Database::openMDBConnection(String dbName)
{
   String cs = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + dbName;
   // voir message compilo quand commentaire retiré
   //cnnMDB = new TADOConnection(this);
   Database::cnnMDB->CursorLocation = clUseClient;
   Database::cnnMDB->ConnectionString = cs;
   Database::cnnMDB->LoginPrompt = false;
   try { Database::cnnMDB->Connected = true; }
   catch (EADOError *e) { return false; }
 
   return true;
}
 
bool __fastcall Database::openSQLConnection(bool bForBif, String userName, String pw, String serverNamedPipe, String serverAddress, String serverCustom, String dbName)
{
   String cs = "Provider=SQLOLEDB.1;Password=" + pw + ";Persist Security Info=True;" + "User ID=" + userName + ";Initial Catalog=" + dbName;
 
   if(serverNamedPipe != "")
        cs += ";Data Source=" + serverNamedPipe;
   else
        cs += ";Network Address=" + serverAddress + ";Network Library=dbmssocn";
 
   if(serverCustom != "")
   {
        cs = serverCustom;
        cs = StringReplace(cs, "<PW>", pw, TReplaceFlags());
        cs = StringReplace(cs, "<ID>", userName, TReplaceFlags());
        cs = StringReplace(cs, "<DB>", dbName, TReplaceFlags());
   }
 
   if(bForBif)
   {
        // voir message compilo quand commentaire retiré
        //cnnSQLBIF = new TADOConnection(this);
        Database::cnnSQLBIF->CursorLocation = clUseClient;
        Database::cnnSQLBIF->ConnectionString = cs;
        Database::cnnSQLBIF->LoginPrompt = false;
        try { Database::cnnSQLBIF->Open(userName, pw); }
        catch (EADOError *e) { return false; }
 
        return true;
   }
   else
   {
        // voir message compilo quand commentaire retiré
        //cnnSQLData = new TADOConnection(this);
        Database::cnnSQLData->CursorLocation = clUseClient;
        Database::cnnSQLData->ConnectionString = cs;
        Database::cnnSQLData->LoginPrompt = false;
        try { Database::cnnSQLData->Open(userName, pw); }
        catch (EADOError *e) { return false; }
 
        return true;
   }
}
 
bool __fastcall Database::openSQLConnections(String userName, String pw, String serverNamedPipe, String serverAddress, String serverCustom, String BIFDBName, String DataDBName)
{
   bool rc;
 
   rc = openSQLConnection(true, userName, pw, serverNamedPipe, serverAddress, serverCustom, BIFDBName);
   if(rc)
   {
        rc = openSQLConnection(false, userName, pw, serverNamedPipe, serverAddress, serverCustom, DataDBName);
        if(!rc)
                Database::cnnSQLBIF->Close();
   }
 
   return rc;
}
 
#pragma package(smart_init)
Merci d'avance.