Heim  >  Artikel  >  Betrieb und Instandhaltung  >  Detaillierte Einführung in die Implementierung des C++-Betriebs einer MySQL-Datenbank unter Linux

Detaillierte Einführung in die Implementierung des C++-Betriebs einer MySQL-Datenbank unter Linux

黄舟
黄舟Original
2017-05-31 10:58:313822Durchsuche

Aufgrund der Arbeit muss ich mir eine Woche Zeit nehmen, um C/C++-Methoden für den Zugriff auf verschiedene Datenbanken zu studieren und zu planen, eine Reihe von Datenbankoperationen zu kapseln. Jetzt präsentiere ich Der einfachste Teil: Zugriff auf die MySQL-Datenbank unter Linux.

Wenn Sie ein Projekt in C++ schreiben möchten, ist eine Datenbank ein Muss. Deshalb habe ich in den letzten zwei Tagen gelernt, wie man die MySQL-Datenbank in C++ bedient. Es gibt keine Tutorials, nur das Wissen, das ich online gesucht habe. Hier ist eine Zusammenfassung.

Es gibt zwei Möglichkeiten, eine Verbindung zur MySQL-Datenbank herzustellen: Die erste besteht darin, eine ADO-Verbindung zu verwenden, diese ist jedoch nur für Windows-Plattformen geeignet. Die zweite Möglichkeit besteht darin, MySQL zu verwenden eigene C APIFunktionMit Datenbank verbinden. Ich entwickle unter der Linux-Plattform und verwende daher die zweite Methode. Es gibt viele API-Funktionen, aber nur wenige werden häufig verwendet, und ich verwende nur einige davon.

API-Funktion

1.mysql_real_connect()

Verbinden Sie einen MySQL-Server

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)

Wenn die Verbindung erfolgreich ist, geben Sie das MYSQL*-Verbindungshandle zurück . Wenn die Verbindung fehlschlägt, wird NULL zurückgegeben. Für eine erfolgreiche Verbindung ist der Rückgabewert derselbe wie der Wert des ersten Parameters

2.mysql_query()

Führen Sie das angegebene „NULL-terminiert“ aus string " SQL-Abfrage

gibt eine Ergebnistabelle zurück. Vorausgesetzt, die Abfrage ist erfolgreich, können Sie mysql_num_rows() aufrufen, um zu sehen, wie viele Zeilen zurückgegeben werden entsprechend der SELECT-Anweisung. Oder rufen Sie mysql_affected_rows() auf, um zu sehen, wie viele Zeilen von der Anweisung betroffen sind, die DELETE, INSERT, REPLACE oder UPDATE entspricht.

3.mysql_store_result()

MYSQL_RES *mysql_store_result(MYSQL *mysql)

Rufen Sie den vollständigen Ergebnissatz an den Client ab. Die häufigste Methode für Clients zur Verarbeitung von Ergebnismengen ist der Aufruf von mysql_store_result(), wodurch die gesamte Ergebnismenge auf einmal abgerufen wird. Diese Funktion ruft alle von der Abfrage zurückgegebenen Zeilen vom Server ab und speichert sie auf dem Client. Für jede Abfrage (SELECT, SHOW, DESCRIBE, EXPLAIN, CHECK TABLE usw.), die erfolgreich Daten abruft, muss mysql_store_result() oder mysql_use_result() aufgerufen werden. Für andere Abfragen besteht keine Notwendigkeit, mysql_store_result() oder mysql_use_result() aufzurufen. Wenn jedoch mysql_store_result() in jedem Fall aufgerufen wird, verursacht dies keinen Schaden oder Leistungseinbußen.

4.mysql_num_rows()

Gibt die Anzahl der Zeilen im Ergebnissatz zurück.

5.mysql_num_fields()

Gibt die Anzahl der Felder im Ergebnissatz zurück oder false, wenn ein Fehler auftritt.

6.mysql_fetch_field()

MYSQL_FIELD* mysql_fetch_field(MYSQL_RES *result);
Erhalten Sie den Typ des nächsten Tabellenfelds und geben Sie am Ende NULL zurück.

7.mysql_fetch_row()

MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);

Holen Sie sich die nächste Zeile aus der Ergebnismenge und geben Sie erfolgreich ein Array mit einem Wert größer als zurück 0.

8.mysql_fetch_field_direct()

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

Geben Sie bei gegebener Feldnummer den Typ des Tabellenfelds zurück und geben Sie am Ende NULL zurück .

Einfacher Code für die Verwaltung von Studenteninformationen

Ich kann mich beim bloßen Ansehen nicht daran erinnern, also habe ich diese Funktionen verwendet, um eine Benutzeroberfläche für die Verwaltung von Studenteninformationen zu schreiben, leider dieses Mal JahrC Was die Gestaltung von Sprachkursen betrifft, wusste ich damals noch nicht, wie man eine Datenbank verwendet, und alles war in Dateien geschrieben. Als ich herausfand, dass es zu spät war, bereute ich es. . . . Das Folgende ist der 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;
 }
C++-Kapselung der MyDB-Klasse

Später wurden diese Funktionen einfach gekapselt, um sie in Zukunft einfacher verwenden zu können.

 /*************************************************************************
   > 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;
 }
Das Folgende sind die laufenden Ergebnisse:

Die folgenden Probleme sind aufgetreten:

1 Fehler beim Kompilieren
Da Gibt es keine solche Datei oder kein solches Verzeichnis?

#include<mysql/mysql.h> 
^
Kompilierung unterbrochen.

Lösung: Zusätzlich zu mysql-client und mysql-server
mysql-devel installiert und dann wurde das Problem gelöst.

2. Wenn die benutzerdefinierte

Variable an die SQL-Anweisung übergeben wird, tritt ein Problem auf

在网上查找到这样一种格式,
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();
 }

Das obige ist der detaillierte Inhalt vonDetaillierte Einführung in die Implementierung des C++-Betriebs einer MySQL-Datenbank unter Linux. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn