Published on May 11, 2017
Author: LaurentBUNIET
Source: slideshare.net
1. Cours C++ (2002) semaine 3 jour 5
2. Cours semaine 3 jour 5 Cours C++ 2 Plan du jour Exercices récapitulatifs avec C++, une base de données et XML
3. Cours semaine 3 jour 5 Cours C++ 3 Premier programme Ce premier programme permet d’accèder à une base de donnée, de créer divers types de fichiers sérialisés, de modifier ces fichiers et finalement de modifier la base de donnée Nous utiliserons la base de données PTContact dont nous nous sommes déjà servis
4. Cours semaine 3 jour 5 Cours C++ 4 Premier programme (2) L’accès à la base de données se fera par ADO, ActiveX Data Object Les fichiers sérialisés seront de deux type XML ADTG, Advanced Data TableGram, un format Microsoft Nous créerons également des DOM pour voir le traitement en cours
5. Cours semaine 3 jour 5 Cours C++ 5 Premier programme (3) #import "c:Program FilesCommon Filessystemadomsado15.dll" rename_namespace( "MSXML2" ) rename( "EOF", "ADOEOF" ) #import "c:WINNTsystem32msxml4.dll" // pour MSXML 3.0 //#import "c:WINNTsystem32msxml3.dll" using namespace MSXML2; #include <ole2.h> #include <stdio.h> #include <conio.h> #include <io.h> // une fonction inline pour voir, un peu inutile mais bon pour la démo inline void TESTHR( HRESULT x ) { if FAILED(x) _com_issue_error( x ); };
6. Cours semaine 3 jour 5 Cours C++ 6 Premier programme (4) bool supprimeFichier() { struct _finddata_t xml_file; long hFile; if( ( hFile = _findfirst( "res.xml", &xml_file ) ) != -1L ) { DeleteFile( "res.xml" ); DeleteFile( "res_new.xml" ); DeleteFile( "res.adtg" ); return true; } else return false; }
7. Cours semaine 3 jour 5 Cours C++ 7 Premier programme (5) void AffichageErreurCom( _com_error &e ) { _bstr_t bstrSource( e.Source() ); _bstr_t bstrDescription( e.Description() ); printf( "Erreur COMn" ); printf( "tCode - numéro : %08lxn", e.Error() ); printf( "tCode - signification : %sn", e.ErrorMessage() ); printf( "tSource = %sn", (LPCSTR) bstrSource ); printf( "tDescription = %sn", (LPCSTR) bstrDescription ); }
8. Cours semaine 3 jour 5 Cours C++ 8 Premier programme (6) void AffichageErreurProvider( _ConnectionPtr pConnection ) { ErrorPtr pErr = NULL; if( ( pConnection->Errors->Count ) > 0 ) { long nCount = pConnection->Errors->Count; for( long i = 0; i < nCount; i++ ) { pErr = pConnection->Errors->GetItem( i ); printf( "Erreur - numéro : %xn", pErr->Number ); printf( "Erreur - description : %sn", (LPCSTR) pErr->Description ); } } }
9. Cours semaine 3 jour 5 Cours C++ 9 Premier programme (7) void Sauve_DB_XML() { HRESULT hr = S_OK; _RecordsetPtr pRstContacts = NULL; _bstr_t strCnn( "Provider=MSDASQL.1;Persist Security Info=False;" "Data Source=PTContact;Mode=ReadWrite" ); try { TESTHR(pRstContacts.CreateInstance(__uuidof(Recordset ))); pRstContacts->Open( "SELECT * FROM Contacts", strCnn, adOpenDynamic, adLockBatchOptimistic, adCmdText );
10. Cours semaine 3 jour 5 Cours C++ 10 Premier programme (8) // persistence du RecordSet dans un fichier XML pRstContacts->Save( "res.xml", adPersistXML ); // persistence du RecordSet dans une structure DOM IXMLDOMDocumentPtr pXMLDOMDoc; TESTHR( pXMLDOMDoc.CreateInstance( __uuidof( DOMDocument ) ) ); pRstContacts->Save( pXMLDOMDoc.GetInterfacePtr(), adPersistXML ); // affichage du DOM printf( pXMLDOMDoc->Getxml() ); pRstContacts->Close();
11. Cours semaine 3 jour 5 Cours C++ 11 Premier programme (9) } catch(_com_error &e) { _variant_t vtConnect = pRstContacts->GetActiveConnection(); switch( vtConnect.vt ) { case VT_BSTR: AffichageErreurCom( e ); break; case VT_DISPATCH: AffichageErreurProvider( vtConnect ); break; default: printf( "Une erreur (ni COM, ni provider) s'est produite" ); break; } }}
12. Cours semaine 3 jour 5 Cours C++ 12 Premier programme (10) void Sauve_XML_ADTG() { HRESULT hr = S_OK; _RecordsetPtr pRstContacts = NULL; try { TESTHR(pRstContacts.CreateInstance(__uuidof(Recordset))); pRstContacts->Open( "res.xml", "Provider=MSPersist;", adOpenForwardOnly, adLockPessimistic, adCmdFile );
13. Cours semaine 3 jour 5 Cours C++ 13 Premier programme (11) pRstContacts->Find( "LastName = 'BUNIET'", NULL, adSearchForward ); if( pRstContacts->ADOEOF ) { printf( "Le contact n'a pas été trouvé dans le fichier XMLn" ); pRstContacts->Close(); return; } else { printf( "Le contact a été trouvé dans le fichier XMLn" ); }
14. Cours semaine 3 jour 5 Cours C++ 14 Premier programme (12) pRstContacts->GetFields()->GetItem( "City" )->PutValue( "Berkeley" ); pRstContacts->GetFields()->GetItem( "PostalCode" )->PutValue( "L-2401" ); pRstContacts->Update(); IXMLDOMDocumentPtr pXMLDOMDoc; TESTHR( pXMLDOMDoc.CreateInstance( __uuidof( DOMDocument ) ) ); pRstContacts->Save( pXMLDOMDoc.GetInterfacePtr(), adPersistXML ); printf( pXMLDOMDoc->Getxml() ); // persistence du RecordSet dans un ADTG pRstContacts->Save( "res.adtg", adPersistADTG ); pRstContacts->Close();
15. Cours semaine 3 jour 5 Cours C++ 15 Premier programme (13) } catch(_com_error &e) { _variant_t vtConnect = pRstContacts->GetActiveConnection(); switch( vtConnect.vt ) { case VT_BSTR: AffichageErreurCom( e ); break; case VT_DISPATCH: AffichageErreurProvider( vtConnect ); break; default: printf( "Une erreur (ni COM, ni provider) s'est produite" ); break; } }}
16. Cours semaine 3 jour 5 Cours C++ 16 Premier programme (14) void Sauve_ADTG_BD() { HRESULT hr = S_OK; _RecordsetPtr pRstContacts = NULL; _ConnectionPtr pCnn = NULL; _bstr_t strCnn( "Provider=MSDASQL.1;Persist Security Info=False;" "Data Source=PTContact;Mode=ReadWrite" ); try { TESTHR( pCnn.CreateInstance( __uuidof( Connection ) ) ); TESTHR(pRstContacts.CreateInstance(__uuidof( Recordset)));
17. Cours semaine 3 jour 5 Cours C++ 17 Premier programme (15) pRstContacts->Open( "res.adtg", "Provider=MSPersist;", adOpenForwardOnly, adLockOptimistic, adCmdFile ); pCnn->Open( strCnn, "", "", NULL ); pRstContacts->PutActiveConnection( _variant_t( (IDispatch *) pCnn ) ); pRstContacts->UpdateBatch( adAffectAll ); pRstContacts->Close(); pCnn->Close();
18. Cours semaine 3 jour 5 Cours C++ 18 Premier programme (16) } catch(_com_error &e) { _variant_t vtConnect = pRstContacts->GetActiveConnection(); switch( vtConnect.vt ) { case VT_BSTR: AffichageErreurCom( e ); break; case VT_DISPATCH: AffichageErreurProvider( vtConnect ); break; default: printf( "Une erreur (ni COM, ni provider) s'est produite" ); break; } }}
19. Cours semaine 3 jour 5 Cours C++ 19 Premier programme (17) void main() { if( FAILED( ::CoInitialize( NULL ) ) ) return; if( supprimeFichier() ) { printf( "Le fichier res.xml a été supprimé!n" ); } printf( "Passage de DB vers XMLn" ); Sauve_DB_XML(); printf( "Passage de XML vers ADTGn" ); Sauve_XML_ADTG(); printf( "Passage de ADTG vers DBn" ); Sauve_ADTG_BD(); ::CoUninitialize(); }
20. Cours semaine 3 jour 5 Cours C++ 20 Premier programme (18) Ce programme consulte la table Contacts dans la Data Source PTContact Il stocke tous les enregistrements dans un fichier XML Au passage, on sauve les enregistrements dans un DOM Ce DOM est ensuite affiché à l’écran, dans la console
21. Cours semaine 3 jour 5 Cours C++ 21 Premier programme (19) Le fichier XML est rechargé en mémoire, il est modifié et sauvagardé dans ub ADTG Le nouveau DOM est lui aussi affiché dans la fenêtre console Le contenu du fichier ADTG est finalement chargé et sauvegardé dans PTContact Le tout en COM Normal pour utiliser de l’ADO !
22. Cours semaine 3 jour 5 Cours C++ 22 Premier programme (20) Exercice : Reprenez le premier exemple de la journée traitant de la persistence XML d’une table d’une base de données relationnelle Écrivez un fichier XSL permettant de produire une sortie HTML à ce fichier Testez votre fichier XSL avec le programme MSXSL et Internet Explorer (pour le fichier résultat HTML)
23. Cours semaine 3 jour 5 Cours C++ 23 Premier programme (21) Exercice (suite) : Modifier le premier programme en vous inspirant des sources de MSXSL : effectuez la transformation XSL à l’intérieur du programme ComSave
24. Cours semaine 3 jour 5 Cours C++ 24 Deuxième programme Il ne s’agit pas d’un programme mais d’un ensemble de programmes fournis par Microsoft Le workspace contient 5 projets liés Ils permettent de voir la manière de créer et de traiter des documents XML Notion de producteurs et de consommateurs
25. Cours semaine 3 jour 5 Cours C++ 25 Deuxième programme (2) Récupérez le fichier xml_consumer.exe Décompressez le fichier dans votre répertoire "My Projects" Ouvrez le fichier de Workspace qui se trouve sous "XMLComponents" Le fichier de workspace s’appelle "XMLComponents.dsw"
26. Cours semaine 3 jour 5 Cours C++ 26 Deuxième programme (3) Mettez l’Active Project sur tstXML Compilez Exécutez Allez regardez c:example.xml
27. Cours semaine 3 jour 5 Cours C++ 27 Deuxième programme (4) Exercice : Qui a écrit quoi ? Modifiez le programme approprié de manière à créer deux autres childObjects dans le fichier c.example.xml Dans les childObjects générés, ajoutez un troisième élément racine "myNewValue" pouvant contenir une chaîne de caractères
28. Cours semaine 3 jour 5 Cours C++ 28 L’avenir de C++ C et C++ semble être des langages très efficaces lorsqu’il s’agit de faire des programmes dont l’objectif est D’être compacte D’être rapide D’être très technique Et on peut se dire que c’est vrai…
29. Cours semaine 3 jour 5 Cours C++ 29 L’avenir de C++ (2) À la Washington University de Saint Louis (Missouri), un chercheur (Douglas Schmidt) a développé un ensemble de programmes écrit en C++ permettant de mettre en œuvre CORBA Modèle objet distribué "similaire" à COM Microsoft fait d’ailleurs bizarrement partie des sponsors ayant financé le projet !
30. Cours semaine 3 jour 5 Cours C++ 30 L’avenir de C++ (3) Cette architecture est composée de deux blocs ACE, Adaptive Communication Environment TAO, The ACE ORB
31. Cours semaine 3 jour 5 Cours C++ 31 L’avenir de C++ (4) La totalité de la plate-forme représente un total de 135.000 ligne de code en C++ C’est beaucoup Et Douglas Schmidt est un très bon programmeur C++ ! Rassurez-vous, il n’était pas seul pour les 135.000 lignes… Consultez les sources du projet… ACE-TAO est très rapide Il est même tellement rapide qu’il s’agit désormais d’une plate-forme CORBA temps-réel ! Et il semble que ce soit bien la plus rapide du marché…
32. Cours semaine 3 jour 5 Cours C++ 32 L’avenir de C++ (5) La plate-forme est tellement efficace que certains industriels l’utilisent Parmi ces industriels se trouvent Boeing TAO est une plateforme logicielle utilisée dans l’avionique des dernières versions des avions : F15 Eagle (au moins en test) F/A 18 Hornet (au moins en test) AV-8B Harrier (en production)
33. Cours semaine 3 jour 5 Cours C++ 33 L’avenir de C++ (6) C++ semble donc avoir de beaux jours devant lui Des produits industriels l’utilisent Et certains de ces produits sont sensibles ! Et pourtant :
34. Cours semaine 3 jour 5 Cours C++ 34 L’avenir de C++ (7) Douglas Schmidt a quitté la wustl pour rejoindre UCI, University of California, Irvine Il y développe Zen, une plateforme CORBA temps-réel en … Java
35. Cours semaine 3 jour 5 Cours C++ 35 Questions / Remarques
36. Cours semaine 3 jour 5 Cours C++ 36 Le mot de la fin Bons pointeurs !