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

C++ Discussion :

Le C++ et les Bases de données


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2015
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

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

    Informations forums :
    Inscription : Février 2015
    Messages : 39
    Points : 27
    Points
    27
    Par défaut Le C++ et les Bases de données
    Bonjour,
    Je suis un débutant sur C++. Je travail sur le développement d'une application informatique en C++, et je suis sur l'étape où je dois écrire du code qui charge ou appelle ou interroge ma base de donnée. Sauf que je ne suis pas habitué à ce genre de problème, c'est la première fois en faite ! Je ne trouve pas de ressource qui traite cette problématique.
    Ma question est quels sont les outils et techniques qui nous permettent de charger les objets de la base de données à partir d'un code C++ et s'il y a des tutoriels ou des ressources qui traitent cette problématique ?
    Merci !

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 669
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 669
    Points : 10 674
    Points
    10 674
    Par défaut
    Pour le bas niveau, voici 2 termes à chercher sur
    1. Domain model (<- lien wiki en)
    2. Mapping objet-relationnel (<- lien wiki fr)


    C'est un débat très complexe avec des guerres de tranchées , justement parce que ORM est considéré comme de la mauvaise POO.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2015
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

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

    Informations forums :
    Inscription : Février 2015
    Messages : 39
    Points : 27
    Points
    27
    Par défaut
    Pour bien m'expliquer : mon problème c'est comment gérer ma base de donnée qui est sous access 2013 avec C++? et comment utiliser les requêtes qui sont dans ma base de donnée ?
    c'est à dire dans le corps de mon programme y-t-il des bibliothèques avec des fonctions bien définis que je dois utiliser?
    merci !

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 168
    Points : 12 287
    Points
    12 287
    Par défaut
    mon problème c'est comment gérer ma base de donnée qui est sous access 2013 avec C++?
    Alors vous prenez le problème à l'envers.
    Si vous commencez par C++ pour descendre jusqu'à ACCESS, vous vous prenez le nombre colossale de librairies, frameworks et autre middlewares accessibles depuis le C++ juste pour trouver les quelques composants plus ou moins compatible avec cette antiquité d'ACCESS.
    En prenant le problème dans l'autre sens, depuis ACCESS, vous avez quelques composants/Framework utilisable avec ACCESS (l'ouverture, pour ACCESS, ce n'est pas une qualité cardinale, LOL).
    Si vous ne voulez pas être soudé à ACCESS jusqu'à la fin des temps, vous pouvez tenter de mettre un middleware entre ACCESS et votre application, comme un de bas niveau ODBC (beurk!) ou avec un niveau d'abstraction de plus au niveau comme un ORM compatible comme Entity Framework ou qui s'appuie sur un autre middleware de plus bas niveau (comme ODBC) => middlewares multi-couche.

    Si vous voulez y aller comme un bourrin sans évaluer les différentes approches, je vois 2 approches de golgoth :
    - #import sur les composants COM d'accès à ACCESS, https://msdn.microsoft.com/fr-fr/lib...or=-2147217396
    - faire du C++/CLI pour accéder au Framework .NET bas niveau d'accès aux données ADO.NET (voir aussi les Framework de plus haut niveau).

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2015
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

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

    Informations forums :
    Inscription : Février 2015
    Messages : 39
    Points : 27
    Points
    27
    Par défaut
    Si vous ne voulez pas être soudé à ACCESS jusqu'à la fin des temps, vous pouvez tenter de mettre un middleware entre ACCESS et votre application, comme un de bas niveau ODBC (beurk!) ou avec un niveau d'abstraction de plus au niveau comme un ORM compatible comme Entity Framework ou qui s'appuie sur un autre middleware de plus bas niveau (comme ODBC) => middlewares multi-couche.
    je sais très bien qu'il y a chemin autre d'être soudé a access jusqu'à la fin des temps mais à mon niveau je veux commencer par un truc simple pour voir le processus comment il fonctionne et après bien sur pour voir autrement je vais passer par un middlewares. Alors pour commencer est ce que DAO par exemple est applicable dans mon cas.
    Merci !

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 168
    Points : 12 287
    Points
    12 287
    Par défaut
    J'ai pas d'Access 2013 sous la main.
    Vérifiez dans la base de registre les ProgID qui ont été fourrés par ACCESS 2013, s'il en fournit encore.
    J'avais lu ACCESS 2003, pas ACCESS 2013, je suis pas sûr que M$ continue à fournir des composants COM directement dans ACCESS.

    EDIT : ha ba si, vu qu'il y a toujours un support VBA dans Office.
    Vous aurez largement plus de documentation sur le "modèle objet" du bidule dans les sources VBA qu'en C++.

    Alors pour commencer est ce que DAO par exemple est applicable dans mon cas.
    Oui.
    Mais vous parlez des classes type CDaoDatabase des MFC ou les classes générés par "#import "DAOxxx.dll" ?

    Montrez votre code utilisant DAO et le problème concret.

  7. #7
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut
    Access, c'est un choix ou une contrainte ?
    Si c'est un choix je suggère de prendre plutôt sql server express.
    Et pour ne pas trop se prendre la tête, foncer dans les objet COM, MSADO.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #ifdef _WIN64
    #import <C:\Program Files\Common Files\SYSTEM\ADO\msado60.tlb> named_guids rename("EOF", "EndOfFile")
    #else
    #import <C:\Program Files (x86)\Common Files\System\ado\msado60.tlb> named_guids rename("EOF", "EndOfFile")
    #endif
    C'est facile, c'est flexible, c'est robuste, c'est éprouvé (depuis 20 ans, tu penses !), c'est supporté (et pas du tout près de tomber dans l'obsolescence).
    Mais ça ignore la STL et c'est moyennement performant. Ce n'est pas standard, sauf à considèrer que Windows est standard...
    Les COM sont nés à une époque où C++ balbutiait à peine sa première normalisation et où microsoft révolutionnait le monde des IDE en sortant VS6 tout en balayant au passage la concurrence. C'était génial

    En bref, à mon humble avis, si tu débutes en C++ et tu es sous Windows, je suggère MSADO.
    Voici un exemple de code sorti de son contexte
    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
     
    void test_db(stc::tstring const & databaseHist)
    {
    	ADODB::_ConnectionPtr f_historydb(__uuidof(ADODB::Connection));// (L"ADODB.Connection");
    	f_historydb->CommandTimeout = 300;
    	if (f_historydb->Open(L"Provider=SQLNCLI11;Server=MyServer;Database=MyDb;UID=sa;pwd=MySecret", L"", L"", ADODB::adConnectUnspecified))
    	{
    		unsigned valueId = 0;
    		{
    			stc::tstring query = _T("SELECT max(ValueId) FROM ");
    			query += databaseHist;
    			query += _T("..TextTest");
    			ADODB::_RecordsetPtr rs = f_historydb->Execute(query.c_str(), NULL, ADODB::adCmdText);//_com_util::ConvertStringToBSTR
    			while (!rs->EndOfFile)
    			{
    				_variant_t v = rs->Collect[0l];
    				if (V_VT(&v) == VT_I4)
    					valueId = (long)v;
    				//s = _TCS_FROM_NOT_NULL_VARIANT(rs->Collect[1l]);
    				rs->MoveNext();
    			}
    			rs->Close();
    			valueId += 5;
    		}
    		ADODB::_CommandPtr f_qhistory(__uuidof(ADODB::Command));
    		{
    			stc::tstring query = _T("INSERT INTO ");
    			query += databaseHist;
    			query += _T("..TextTest"
    				" (ValueId,ShortText,LongText,ShortWText,LongWText)"
    				" VALUES (?,?,?,?,?)");
    			f_qhistory->CommandText = query.c_str();//_com_util::ConvertStringToBSTR
    			f_qhistory->CommandType = ADODB::adCmdText;
    			f_qhistory->ActiveConnection = f_historydb;
    			f_qhistory->Parameters->Append(f_qhistory->CreateParameter(L"ValueId", ADODB::adInteger, ADODB::adParamInput, sizeof(long)));
    			f_qhistory->Parameters->Append(f_qhistory->CreateParameter(L"ShortText", ADODB::adVarChar, ADODB::adParamInput, 20));
    			f_qhistory->Parameters->Append(f_qhistory->CreateParameter(L"LongText", ADODB::adLongVarChar, ADODB::adParamInput, 2 * 1024 * 1024 - 1));//?
    			f_qhistory->Parameters->Append(f_qhistory->CreateParameter(L"ShortWText", ADODB::adVarWChar, ADODB::adParamInput, 20));
    			f_qhistory->Parameters->Append(f_qhistory->CreateParameter(L"LongWText", ADODB::adLongVarWChar, ADODB::adParamInput, 2 * 1024 - 1));//?
    		}
    		{
    #ifdef _UNICODE
    			stc::tstring sstr(TCS_LEN("short'\" ™ éàè \x2122 123\x03d6"));
    			stc::tstring lstr(TCS_LEN("verylong'\" ™ éàè \x2122 123\x03d6"));
    #else
    			stc::tstring sstr(TCS_LEN("short'\" ™ éàè œ 1234"));
    			stc::tstring lstr(TCS_LEN("verylong'\" ™ éàè œ 1234"));
    #endif
    			//sstr += _T('0');
    			stc::tstring s(lstr);
    			for (unsigned u = 0; u < 80; ++u)
    				s += lstr;
    			lstr = std::move(s);
    			f_qhistory->Parameters->GetItem(0l/*ValueId*/)->Value = (long)valueId;
    			f_qhistory->Parameters->GetItem(1l/*ShortText*/)->Value = sstr.c_str();//_com_util::ConvertStringToBSTR
    			f_qhistory->Parameters->GetItem(2l/*LongText*/)->Value = lstr.c_str();
    			ADODB::_ParameterPtr param2(f_qhistory->Parameters->GetItem(2l/*LongText*/));
    			if (param2->Attributes & ADODB::adParamLong)
    				std::_tcout << s + _T('0') << std::endl;
    			f_qhistory->Parameters->GetItem(3l/*ShortWText*/)->Value = sstr.c_str();//_com_util::ConvertStringToBSTR
    			f_qhistory->Parameters->GetItem(4l/*LongWText*/)->Value = lstr.c_str();
    			f_qhistory->Execute(NULL, NULL, ADODB::adExecuteNoRecords | ADODB::adCmdText);
    		}
    		f_historydb->Close();
    	}
    }

Discussions similaires

  1. [C#] Lister les Bases de données (SQL SERVER) d'un poste
    Par justice007 dans le forum Accès aux données
    Réponses: 9
    Dernier message: 21/06/2010, 16h10
  2. Delphi et les bases de données.
    Par programaniac dans le forum Bases de données
    Réponses: 1
    Dernier message: 30/11/2005, 14h44
  3. Les bases de données dans un logiciel PRo
    Par LaMusaraigne dans le forum Langages de programmation
    Réponses: 1
    Dernier message: 30/06/2005, 08h18
  4. Livre gratuit sur les bases de données...
    Par benby dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 26/05/2005, 12h24
  5. Les Bases de Données! tout un monde!!
    Par kikimnet dans le forum Bases de données
    Réponses: 3
    Dernier message: 29/04/2004, 18h26

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