Partage
  • Partager sur Facebook
  • Partager sur Twitter

Faire une requête SQL via C++ (Visual studio)

Sujet résolu
    9 avril 2019 à 16:44:57

    Salut;

    J'ai pour projet de compléter automatiquement ma table via Visual studio (c++).

    J'ai réussi à faire mes requêtes manuellement: 

    #include <stdio.h>
    #include <stdlib.h>
    #include <winsock.h>
    #include <mysql.h>
    #include <iostream>
    
    using namespace std;
    
    
    int main(void)
    {
    	//Déclaration du pointeur de structure de type MYSQL
    	MYSQL mysql;
    	//Initialisation de MySQL
    	mysql_init(&mysql);
    	//Options de connexion
    	mysql_options(&mysql, MYSQL_READ_DEFAULT_GROUP, "option");
    
    	//Si la connexion réussie...
    	if (mysql_real_connect(&mysql, "localhost", "root", "password", "mysql", 0, NULL, 0))
    	{
    		cout << "Coucou toi!!" << endl;
    		//Requête qui sélectionne tout dans ma table scores
    		mysql_query(&mysql, "USE alerte;");
    mysql_query(&mysql, "INSERT INTO `alertes` (`ID`, `DATE_HEURE`, `X`, `Y`, `STATUT`) VALUES (NULL, current_timestamp(),'20' , '8', 'ALERTE');");
    		mysql_query(&mysql, "SELECT * FROM alertes;");
    
    		//Déclaration des objets
    		MYSQL_RES *result = NULL;
    		MYSQL_ROW row;
    
    		unsigned int i = 0;
    		unsigned int num_champs = 0;
    
    		//On met le jeu de résultat dans le pointeur result
    		result = mysql_use_result(&mysql);
    
    		//On récupère le nombre de champs
    		num_champs = mysql_num_fields(result);
    
    		//Tant qu'il y a encore un résultat ...
    		while ((row = mysql_fetch_row(result)))
    		{
    			//On déclare un pointeur long non signé pour y stocker la taille des valeurs
    			unsigned long *lengths;
    
    			//On stocke ces tailles dans le pointeur
    			lengths = mysql_fetch_lengths(result);
    
    			//On fait une boucle pour avoir la valeur de chaque champs
    			for (i = 0; i < num_champs; i++)
    			{
    				//On ecrit toutes les valeurs
    				printf("[%.*s] ", (int)lengths[i], row[i] ? row[i] : "NULL");
    			}
    			printf("\n");
    		}
    
    		//Libération du jeu de résultat
    		mysql_free_result(result);
    
    		//Fermeture de MySQL
    		mysql_close(&mysql);
    
    	}
    	else  //Sinon ...
    	{
    		printf("Une erreur s'est produite lors de la connexion à la BDD!");
    		cout << endl;
    	}
    
    	system("pause");
    	return 0;
    }
    

    La requête qui m'interresse ici est : 

    mysql_query(&mysql, "INSERT INTO `alertes` (`ID`, `DATE_HEURE`, `X`, `Y`, `STATUT`) VALUES (NULL, current_timestamp(),'20' , '8', 'ALERTE');");

    L'objectif ici est de récupérer automatiquement les valeurs : X , Y, et STATUT. Elles sont stockées dans un fichier "alertes.txt".

    Est-il possible qu'une âme charitable m'aide?^^

       

    • Partager sur Facebook
    • Partager sur Twitter
      9 avril 2019 à 16:54:02

      Bonjour,

      ça ressemble plutôt à du C qu'à du C++ au vu des headers que tu utilises ?

      Qu'en penses-tu ?

      • Partager sur Facebook
      • Partager sur Twitter
        9 avril 2019 à 17:15:26

        Perso j'suis encore débutant, donc j'ai  reproduit se programme grâce à  plusieurs recherche. 

        Je dirai plus que c'est du C++, que du C.

        • Partager sur Facebook
        • Partager sur Twitter
          9 avril 2019 à 17:39:26

          Pas de "printf" dans du C++ (normalement), pas de "cout" dans du C.

          Votre code est un doux mélange peu digeste de C et de C++.

          Mais comme vous utilisez une bibliothèque C et non C++, c'est le genre de truc qui arrive souvent.

          Il faut essayer le cantonner le C le plus possible, via l'utilisation de wrappers, par exemple.

          Cela permet d'avoir un code plus clair et plus simple.

          Mais bon, on n'est plus à des problèmes de lisibilité près, au vu de l'archaïsme de la bibliothèque d'accès aux données utilisée.

          Sauf erreur de ma part, MySQL fourni déjà un wrapper C++ :

          https://dev.mysql.com/doc/connector-cpp/8.0/en/

          Bon, tout cela n'a rien à voir avec VS mais avec MySQL.

          J'aurais jamais ramené ma fraise si le titre avait été correct.

          Et toujours sauf erreur de ma part, les appels à mysql_query sont tous indépendant. Vous ne pouvez pas utiliser des définitions faites dans une requête pour l'utiliser dans une autre.

          Et la manière la plus simple de faire proprement votre truc, c'est via une simple procédure stockée au niveau de la base MySQL.

          • Partager sur Facebook
          • Partager sur Twitter
          Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
            10 avril 2019 à 21:20:29

            Merci pour le liens. :D

            Après,  dans le code que j'ai afficher à une partie qui ne concerne pas mon projet (donc non obligatoire pour son fonctionnement).

            De plus, je ne suis pas seul pour le projet. Et le lien entre mon camarade (qui lui travail sur VS) et moi est un fichier texte.

            Malgré la "mocheté" :D de mon programme je l'admets, il fonction est  fait le travail demander. 

            Pour le moment, on aimerais juste automatiser incrémentation (surtout pour le X et le Y).

            Mais je n'arrive toujours pas à trouver une solution.

            Si vous avez une solution, je suis preneur. 

            • Partager sur Facebook
            • Partager sur Twitter
              10 avril 2019 à 23:41:33

              Comme Bacelar l'a suggéré, une requete de selection sur le critere de la date t'aidera a recuperer automatiquement les valeurs que tu veux.

              Et tant qu'on y est encore, http://innovelectronique.fr/2017/06/17/utiliser-le-connecteur-c-pour-la-bdd-mysql/

              Ce lien est le meilleur que j'ai pu trouver sur du c++ avec du sql (j'en avais fait une version avec des unique_ptr mais je suis sur mobile :(

              • Partager sur Facebook
              • Partager sur Twitter
                16 avril 2019 à 8:14:03

                Merci Dropper pour le lien.

                Il me reste un problème. 

                Quand je compile le programme fournie par le lien:

                // Test connecteur C++ MySQL
                // O. Dartois, Juin 2017
                
                //#include <stdlib.h>
                #include <iostream>
                
                // Les includes strictement nécessaire pour cet exemple
                #include <cppconn/driver.h>
                #include <cppconn/exception.h>
                #include <cppconn/resultset.h>
                #include <cppconn/statement.h>
                
                using namespace std;
                
                int main(void)
                {
                	cout << endl;
                	cout << "Premier test du connecteur C++ Mysql" << endl;
                
                	// La gestion d'erreur se fait proprement avec les exceptions
                	// sinon retirer le try...catch
                
                	try {
                		// Les variables nécessaires à notre programme
                		sql::Driver* driver;
                		sql::Connection* con;
                		sql::Statement* stmt;
                		sql::ResultSet* res;
                
                		// Etape 1 : créer une connexion à la BDD
                		driver = get_driver_instance();
                		// on note les paramètres classiques: adresse ip du serveur et port, login, mot de passe
                		con = driver->connect("localhost", "root", "password");
                
                		// Etape 2 : connexion à la base choisie, ici olivier_db
                		con->setSchema("mysql");
                
                		// Etape 3 : création d'un objet qui permet d'effectuer des requêtes sur la base
                		stmt = con->createStatement();
                
                		// Etape 4 : exécution d'une requete : ici on sélectionne tous les enregistrements
                		// de la table Animal
                		res = stmt->executeQuery("SELECT * FROM alerte;");
                
                		// Etape 5 : exploitation du résultat de la requête
                		while (res->next()) {
                			cout << "\t... MySQL a repondu: ";
                			// Acces par non du champ de la table : ici le champ 'id' que l'on recupère au format string
                			cout << res->getString("id") << endl;
                			cout << "\t... MySQL la suite : ";
                			// Acces à la donnée par son numéro de colonne, 1 étant le premier (ici 'id'), 5 le nom de l'animal
                			cout << res->getString(5) << endl;
                		}
                
                		// On nettoie tout avant de sortir : effacement des pointeurs
                		// le pointeur sur le Driver sera effacé tout seul
                		delete res;
                		delete stmt;
                		delete con;
                
                	}
                	catch (sql::SQLException &e) {
                		// Gestion des execeptions pour déboggage
                		cout << "# ERR: " << e.what();
                		cout << " (code erreur MySQL: " << e.getErrorCode();
                		cout << ", EtatSQL: " << e.getSQLState() << " )" << endl;
                	}
                
                	//cout << endl;
                
                	// on sort en indiquant que tout c'est bien passé
                	return EXIT_SUCCESS;
                }

                Il y a cette fenêtre qui s'affiche:

                Le problème est surement du à l'installation de bibliothèque (mais je ne vois pas où j'ai fait une erreur, car j'ai bien suivie les étapes).

                Ensuite, j'ai compiler en mode pas à pas. La fenêtre apparaît à p 

                • Partager sur Facebook
                • Partager sur Twitter
                  16 avril 2019 à 8:22:29

                  Désolé, j'ai eu un problème de pc.

                  Je continue avec un autre compte.

                  Je disais.

                  Ensuite, j'ai compiler en commentant puis décommentant ligne par ligne. Le problème apparaît à la ligne suivante:

                  		// Etape 1 : créer une connexion à la BDD
                  		driver = get_driver_instance();


                  Si vous avez une solution à me proposer.

                  • Partager sur Facebook
                  • Partager sur Twitter
                    16 avril 2019 à 10:56:52

                    C'est juste un problème "d'installation" de la Dll.

                    Trouvez cette Dll sur votre disque. L'installateur a dû la mettre quelque part.

                    En attendant une approche plus propre (cf. normalisation du poste de développement), ajoutez le répertoire contenant la Dll dans la variable d'environnement "PATH".

                    Attention à bien relancer VS pour qu'il en tienne compte.

                    EDIT: Oups, j'avais mal lu le message d'erreur, vous devez en avoir plusieurs de Dll sur votre machine, faites en sorte que le PATH contienne la bonne en premier.

                    Si vous en avez qu'une, c'est que le .lib que vous utilisez  n'est pas compatible avec la dll. Vérifiez que vous n'avez pas mélangé des versions différentes de ce Driver.

                    -
                    Edité par bacelar 16 avril 2019 à 11:00:43

                    • Partager sur Facebook
                    • Partager sur Twitter
                    Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                      18 avril 2019 à 8:52:04

                      Ok ... J'ai atteins mes objectifs!!!

                       Merci à tous!!! Grâce vous je comprend mieux mon programme!!!;)

                      • Partager sur Facebook
                      • Partager sur Twitter

                      Faire une requête SQL via C++ (Visual studio)

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown