Maison  >  Article  >  Opération et maintenance  >  Introduction détaillée sur la façon d'implémenter le fonctionnement C++ de la base de données Mysql sous Linux

Introduction détaillée sur la façon d'implémenter le fonctionnement C++ de la base de données Mysql sous Linux

黄舟
黄舟original
2017-05-31 10:58:313820parcourir

En raison du travail, je dois prendre une semaine pour étudier les méthodes C/C++ d'accès à diverses bases de données, et je prévois d'encapsuler un ensemble de classes d'opération de base de données. la partie la plus simple. : Accédez à la Base de données MySQL sous Linux.

Si vous souhaitez écrire un projet en C++, une base de données est indispensable, donc au cours des deux derniers jours, j'ai appris à utiliser la base de données MySQL en C++. Il n'y a pas de tutoriels, juste les connaissances que j'ai recherchées en ligne. Voici un résumé.

Il existe deux manières de se connecter à la base de données MySQL : la première consiste à utiliser la connexion ADO, mais cela ne convient qu'aux plates-formes Windows ; la seconde consiste à utiliser MySQL son propre C APIFonctionSe connecter à la base de données. Je développe sous la plateforme Linux, j'utilise donc la deuxième méthode. Il existe de nombreuses fonctions API, mais seules quelques-unes sont couramment utilisées, et je n'en utilise que quelques-unes.

Fonction API

1.mysql_real_connect()

Connecter un serveur MySQL

MYSQL *mysql_real_connect (MYSQL *mysql, 
const char *host, 
const char *user, 
const char *passwd, 
const char *db, 
unsigned int port, 
const char *unix_socket, 
unsigned long client_flag)

Si la connexion réussit, renvoyez le handle de connexion MYSQL* . Si la connexion échoue, NULL est renvoyé. Pour une connexion réussie, la valeur de retour est la même que la valeur du premier paramètre

2.mysql_query()

Exécuter le "NULL-terminated string " SQL requête

renvoie une table de résultats. En supposant que la requête réussit, vous pouvez appeler mysql_num_rows() pour voir combien de lignes sont renvoyées correspondant à l'instruction SELECT. Ou appelez mysql_affected_rows() pour voir combien de lignes sont affectées par l'instruction correspondant à DELETE, INSERT, REPLACE ou UPDATE.

3.mysql_store_result()

MYSQL_RES *mysql_store_result(MYSQL *mysql)

Récupérer l'ensemble de résultats complet pour le client. La manière la plus courante pour les clients de traiter les jeux de résultats consiste à appeler mysql_store_result(), qui récupère l'intégralité du jeu de résultats en une seule fois. Cette fonction récupère toutes les lignes renvoyées par la requête depuis le serveur et les enregistre sur le client. Pour chaque requête (SELECT, SHOW, DESCRIBE, EXPLAIN, CHECK TABLE, etc.) qui récupère avec succès des données, mysql_store_result() ou mysql_use_result() doit être appelée. Pour les autres requêtes, il n'est pas nécessaire d'appeler mysql_store_result() ou mysql_use_result(), mais si mysql_store_result() est appelé dans tous les cas, cela ne causera aucun dommage ni dégradation des performances.

4.mysql_num_rows()

Renvoie le nombre de lignes dans l'ensemble de résultats.

5.mysql_num_fields()

Renvoie le nombre de champs dans l'ensemble de résultats, ou false en cas d'échec.

6.mysql_fetch_field()

MYSQL_FIELD* mysql_fetch_field(MYSQL_RES *result);
Obtenir le type du champ de table suivant et renvoyer NULL à la fin.

7.mysql_fetch_row()

MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);

Récupérez la ligne suivante de l'ensemble de résultats et renvoyez avec succès un tableau avec une valeur supérieure à 0.

8.mysql_fetch_field_direct()

MYSQL_FIELD* mysql_fetch_field_direct(MYSQL_RES *result, int i);

Étant donné le numéro de champ, renvoie le type du champ de table et renvoie NULL à la fin .

Code simple de gestion des informations sur les étudiants

Je ne m'en souviens pas rien qu'en le regardant, j'ai donc utilisé ces fonctions pour écrire une interface de gestion des informations sur les étudiants, hélas, cette fois-ci. annéeC Pour la conception des cours de langue , je ne savais pas utiliser une base de données à cette époque et tout était écrit dans des fichiers. Je l'ai regretté quand j'ai découvert qu'il était trop tard. . . . Voici le code :

 /*************************************************************************
   > File Name: student.cpp
   > Author: Tanswer_ 
   > Mail: 98duxm@gmail.com
   > Created Time: 2017年05月28日 星期日 16时50分34秒
 ************************************************************************/
          
 #include <iostream>
 #include <string> 
 #include <stack> 
 #include <algorithm>
 #include <sstream>
 #include <mysql/mysql.h>
 #include <unistd.h>
          
 using namespace std;
          
          
 MYSQL mysql;   
 MYSQL_ROW row;  
 MYSQL_FIELD* field = NULL;       
 MYSQL_RES* result;                                                  
          
 string IntToStr(int num)
 {         
   stringstream ss;
   ss.clear();
   ss << num;
   return ss.str();
 }
                                                            
 void Add()
 {
   string fname,fsex,ftel,faddr;
   int fage;
   char choice; 
   do
   {
   ┊  cout << "请依次输入以下信息:" << endl;
   ┊  cout << "\nName: ";cin >> fname;
   ┊  cout << "\nSex: ";cin >> fsex;
   ┊  cout << "\nAge: "; cin >> fage;
   ┊  cout << "\nTel: "; cin >> ftel;
   ┊  cout << "\nAddr: "; cin >> faddr;
 
   ┊  string sql = "INSERT INTO Infor (name,sex,tel,addr,age) values(&#39;"+fname+"&#39;,&#39;"+fsex+"&#39;,&#39;"+ftel+"&#39;,&#39;"+faddr+"&#39;,   "+IntToStr(fage)+");";
   ┊  //string sql = "INSERT INTO Infor (name,sex,age,tel,addr) values(&#39;小红&#39;,&#39;女&#39;,18,&#39;13333333333&#39;,          &#39;陕西省西安市雁塔区&#39;);";

   ┊  mysql_query(&mysql,sql.c_str());
   ┊  ┊               
   ┊  cout << "是否继续添加(y/n)?: ";
   ┊  cin >> choice;                                                
   }while(choice == &#39;y&#39;);       
                    
 }                   
                    
 void Select()             
 {                   
   int id;              
   cout << "请输入要查询学生的学号: ";
   cin >> id;             
                    
   string sql = "SELECT * FROM Infor WHERE id = "+IntToStr(id)+";";
   mysql_query(&mysql,sql.c_str());
            
   result = mysql_store_result(&mysql);
   if(result == NULL)
   ┊  cout << "fail\n";
            
   for(int i=0; i<mysql_num_fields(result); i++)
   {         
   ┊  field = mysql_fetch_field_direct(result,i);
   ┊  cout << field->name << "\t\t";
   }                
   cout << endl;          
                   
   row = mysql_fetch_row(result);  
   while(row != NULL)        
   {                
   ┊  for(int i=0; i<mysql_num_fields(result); i++)
   ┊  {              
   ┊  ┊  cout << row[i] << "\t\t";                                         
   ┊  }              
   ┊  cout << endl;        
   ┊  row = mysql_fetch_row(result);
   }                
 }                  
                   
                   
 void Update()            
 {                  
   int id;             
   char choice;           
   string newaddr;         
   ┊  cout << "请输入要修改同学的学号: ";
   ┊  cin >> id;          
   ┊  cout << endl << "请输入修改后的地址: ";
   ┊  cin >> newaddr;
   ┊  string sql = "UPDATE Infor SET addr = &#39;"+newaddr+"&#39;WHERE id= "+IntToStr(id)+"; ";
   ┊  mysql_query(&mysql,sql.c_str());                                       
   ┊     
 }       
        
        
 int main()  
 {       
   char choice[5];
        
   mysql_init(&mysql);
   /*连接数据库*/
   if(!mysql_real_connect(&mysql,"localhost","root","dxm242012","Student",0,NULL,0))
   {     
   ┊  cout << "connect fial\n";
   ┊  return -1;
   }     
        
   while(atoi(choice) != &#39;q&#39;)
   {     
   ┊  sleep(4);
   ┊  system("clear");
   ┊  cout << "1.添加学生信息" << endl;
   ┊  cout << "2.查询学生信息" << endl;
   ┊  cout << "3.修改学生信息" << endl;
                                                            
   ┊  cin >> choice;
   
   ┊  cout << choice << endl;
   ┊  switch(atoi(choice))
   ┊  {  
   ┊  ┊  case 1:
   ┊  ┊  ┊  Add();
   ┊  ┊  ┊  break;
   ┊  ┊  case 2:
   ┊  ┊  ┊  Select();
   ┊  ┊  ┊  break;
   ┊  ┊  case 3:
   ┊  ┊  ┊  Update();
   ┊  ┊  ┊  break;
   ┊  ┊  default:
   ┊  ┊  ┊  break;
   ┊  }  
   }
 
   mysql_close(&mysql);
   return 0;
 }

Encapsulation C++ de la classe MyDB

Plus tard, ces fonctions ont été simplement encapsulées pour une utilisation facile dans le futur.

 /*************************************************************************
   > File Name: myDB.h
   > Author: Tanswer_
   > Mail: 98duxm@gmail.com
   > Created Time: 2017年05月28日 星期日 22时26分22秒
 ************************************************************************/
  
 #ifndef _MYDB_H
 #define _MYDB_H
  
 #include <string>
 #include <iostream>
 #include <mysql/mysql.h>
 using namespace std;
  
 class MyDB
 { 
  
 public:
   MyDB();
   ~MyDB();
   bool InitDB(string host,string user,string pwd,string dbname);                          
   bool ExeSQL(string sql);
 private:
   MYSQL* mysql;
   MYSQL* mysql;
   MYSQL_ROW row;
   MYSQL_RES* result;
   MYSQL_FIELD* field;                                                
 };
  
  
 #endif                                                           

 /*************************************************************************                      
   > File Name: myDB.cpp
   > Author: Tanswer_
   > Mail: 98duxm@gmail.com
   > Created Time: 2017年05月28日 星期日 22时27分18秒
 ************************************************************************/
 
 #include <iostream>
 #include <string>
 #include <stack>
 #include <algorithm>   
 #include <mysql/mysql.h> 
 #include "myDB.h"
 
 using namespace std;
 
 MyDB::MyDB()   
 {
   mysql = mysql_init(NULL);
   if(mysql == NULL)
   {
   ┊  cout << "Error: " << mysql_error(mysql);
   ┊  exit(-1);
   }      
 }
 
 MyDB::~MyDB()
 {                                                           
   if(!mysql)
   {
   ┊  mysql_close(mysql);
   }
 }
 
 bool MyDB::InitDB(string host,string user,string pwd,string dbname)
 {
   /*连接数据库*/
   if(!mysql_real_connect(mysql,host.c_str(),user.c_str(),pwd.c_str(),dbname.c_str(),0,NULL,0))
   {
   ┊  cout << "connect fial: " << mysql_error(mysql);
   ┊  exit(-1);
   }
   return true;
 }
 
 bool MyDB::ExeSQL(string sql)
 {
   /*执行失败*/
   if(mysql_query(mysql,sql.c_str()))
   {
   ┊  cout << "query fail: " << mysql_error(mysql);
   ┊  exit(1);                                                   
   }
 
   else
   {
   ┊  /*获取结果集*/
   ┊  result = mysql_store_result(mysql);
 
   ┊  int fieldnum = mysql_num_fields(result);
   ┊  for(int i=0; i<fieldnum; i++)
   ┊  {
   ┊  ┊  row = mysql_fetch_row(result);
   ┊  ┊  if(row <= 0)
   ┊  ┊  ┊  break;
   ┊  ┊  for(int j=0; j<fieldnum; j++)
   ┊  ┊  {
   ┊  ┊  ┊  cout << row[j] << "\t\t";
   ┊  ┊  }
   ┊  ┊  cout << endl;
   ┊  }
   ┊  mysql_free_result(result);
   }
   return true;
 }

 /*************************************************************************                      
   > File Name: main.cpp
   > Author: Tanswer_
   > Mail: 98duxm@gmail.com
   > Created Time: 2017年05月28日 星期日 22时53分43秒
 ************************************************************************/
    
 #include <iostream>
 #include <string>
 #include <stack>
 #include <algorithm>
 #include <mysql/mysql.h>
 #include "myDB.h"
    
 using namespace std;
    
    
 int main()
 {   
   MyDB db;
   db.InitDB("localhost","root","xxxxxx","Student");
   db.ExeSQL("SELECT * FROM Infor;");
   return 0;
 }

Voici les résultats d'exécution :

Voici les problèmes rencontrés :
Erreur lors de la compilation
Là. la compilation de ce fichier ou répertoire

#include<mysql/mysql.h> 
^

n'est pas interrompue.
Solution : en plus de mysql-client et mysql-server, installé mysql-devel, puis le problème a été résolu.

2. Lorsque la variable personnalisée est passée dans l'instruction SQL, un problème se produit

在网上查找到这样一种格式,
string sql = "INSERT INTO Infor (name,sex,tel,addr,age) values('"+fname+"','"+fsex+"','"+ftel+"','"+faddr+"', "+IntToStr(fage)+");";
然后string类型的可以成功,整型的变量还是不行,我又写了个函数把int转为string。

 string IntToStr(int num)
 {         
   stringstream ss;
   ss.clear();
   ss << num;
   return ss.str();
 }

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn