一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - C/C++ - Linux下實現(xiàn)C++操作Mysql數(shù)據(jù)庫

Linux下實現(xiàn)C++操作Mysql數(shù)據(jù)庫

2021-05-13 13:35Tanswer_ C/C++

由于工作需要抽出一周的時間來研究C/C++訪問各種數(shù)據(jù)庫的方法,并打算封裝一套數(shù)據(jù)庫操作類,現(xiàn)在奉上最簡單的一部分:在Linux下訪問MySQL數(shù)據(jù)庫。

想用C++寫項目,數(shù)據(jù)庫是必須的,所以這兩天學了一下C++操作MySQL數(shù)據(jù)庫的方法。也沒有什么教程,就是在網(wǎng)上搜的知識,下面匯總一下。

連接MySQL數(shù)據(jù)庫有兩種方法:第一種是使用ADO連接,不過這種只適合Windows平臺;第二種是使用MySQL自己的C API函數(shù)連接數(shù)據(jù)庫。我是在Linux平臺下開發(fā),所以就采用第二種方法,有很多Api函數(shù),但是常用的就幾個,我也是就用到其中的幾個。

API函數(shù)

1.mysql_real_connect()

連接一個mysql服務(wù)器

?
1
2
3
4
5
6
7
8
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)

如果連接成功,返回MYSQL*連接句柄。如果連接失敗,返回NULL。對于成功的連接,返回值與第1個參數(shù)的值相同

2.mysql_query()

執(zhí)行指定”以NULL終結(jié)的字符串”的SQL查詢

返回一個結(jié)果表,假定查詢成功,可以調(diào)用 mysql_num_rows() 來查看對應(yīng)于 SELECT 語句返回了多少行,或者調(diào)用 mysql_affected_rows() 來查看對應(yīng)于 DELETE,INSERT,REPLACE 或 UPDATE 語句影響到了多少行。

3.mysql_store_result()

?
1
MYSQL_RES *mysql_store_result(MYSQL *mysql)

檢索完整的結(jié)果集至客戶端。客戶端處理結(jié)果集最常用的方式是通過調(diào)用mysql_store_result(),一次性地檢索整個結(jié)果集。該函數(shù)能從服務(wù)器獲得查詢返回的所有行,并將它們保存在客戶端。對于成功檢索了數(shù)據(jù)的每個查詢(SELECT、SHOW、DESCRIBE、EXPLAIN、CHECK TABLE等),必須調(diào)用mysql_store_result()或mysql_use_result() 。對于其他查詢,不需要調(diào)用mysql_store_result()或mysql_use_result(),但是如果在任何情況下均調(diào)用了mysql_store_result(),它也不會導致任何傷害或性能降低。

4.mysql_num_rows()

返回結(jié)果集中的行數(shù)。

5.mysql_num_fields()

返回結(jié)果集中的字段數(shù),如果失敗,則返回 false。

6.mysql_fetch_field()

MYSQL_FIELD* mysql_fetch_field(MYSQL_RES *result);
獲取下一個表字段的類型,結(jié)束返回NULL。

7.mysql_fetch_row()

MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
從結(jié)果集中獲取下一行,成功返回一個數(shù)組,值大于0。

8.mysql_fetch_field_direct()

MYSQL_FIELD* mysql_fetch_field_direct(MYSQL_RES *result, int i);
給定字段編號,返回表字段的類型,結(jié)束返回NULL。

簡單的學生信息管理代碼

光看也記不住啊,就用這些函數(shù)寫了一個學生信息管理界面,唉,去年這時候C語言課程設(shè)計,當時還不知道用數(shù)據(jù)庫,全用文件寫的,知道晚了很后悔啊。。。。下面是代碼:

?
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
/*************************************************************************
  > File Name: student.cpp
  > Author: Tanswer_
  > Mail: [email protected]
  > 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('"+fname+"','"+fsex+"','"+ftel+"','"+faddr+"',   "+IntToStr(fage)+");";
  ┊  //string sql = "INSERT INTO Infor (name,sex,age,tel,addr) values('小紅','女',18,'13333333333',          '陜西省西安市雁塔區(qū)');";
 
  ┊  mysql_query(&mysql,sql.c_str());
  ┊  ┊              
  ┊  cout << "是否繼續(xù)添加(y/n)?: ";
  ┊  cin >> choice;                                               
  }while(choice == 'y');      
                   
}                  
                   
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 = '"+newaddr+"'WHERE id= "+IntToStr(id)+"; ";
  ┊  mysql_query(&mysql,sql.c_str());                                      
  ┊    
}      
       
       
int main() 
{      
  char choice[5];
       
  mysql_init(&mysql);
  /*連接數(shù)據(jù)庫*/
  if(!mysql_real_connect(&mysql,"localhost","root","dxm242012","Student",0,NULL,0))
  {    
  ┊  cout << "connect fial\n";
  ┊  return -1;
  }    
       
  while(atoi(choice) != 'q')
  {    
  ┊  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++封裝MyDB類

后來又把這些函數(shù)簡單的封裝了一下,方便以后直接用。

?
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/*************************************************************************
  > File Name: myDB.h
  > Author: Tanswer_
  > Mail: [email protected]
  > 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: [email protected]
  > 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)
{
  /*連接數(shù)據(jù)庫*/
  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)
{
  /*執(zhí)行失敗*/
  if(mysql_query(mysql,sql.c_str()))
  {
  ┊  cout << "query fail: " << mysql_error(mysql);
  ┊  exit(1);                                                  
  }
 
  else
  {
  ┊  /*獲取結(jié)果集*/
  ┊  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: [email protected]
  > 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;
}  

以下是運行結(jié)果:

Linux下實現(xiàn)C++操作Mysql數(shù)據(jù)庫

下面是遇到的問題:
1. 編譯時出錯
沒有那個文件或目錄

?
1
2
#include<mysql/mysql.h>
^

編譯中斷。
解決:除了mysql-client和mysql-server,又安裝了mysql-devel,然后就解決了。

2. 自定義的變量傳入sql語句時,出現(xiàn)問題

在網(wǎng)上查找到這樣一種格式,
string sql = "INSERT INTO Infor (name,sex,tel,addr,age) values('"+fname+"','"+fsex+"','"+ftel+"','"+faddr+"', "+IntToStr(fage)+");";
然后string類型的可以成功,整型的變量還是不行,我又寫了個函數(shù)把int轉(zhuǎn)為string。

?
1
2
3
4
5
6
7
string IntToStr(int num)
{        
  stringstream ss;
  ss.clear();
  ss << num;
  return ss.str();
}

大概就是這樣,門衛(wèi)大叔很兇,我也很絕望,就寫到這吧,有問題再補充。

原文鏈接:http://blog.csdn.net/tanswer_/article/details/72796570

延伸 · 閱讀

精彩推薦
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下...

    青山的青6062022-01-04
  • C/C++深入理解goto語句的替代實現(xiàn)方式分析

    深入理解goto語句的替代實現(xiàn)方式分析

    本篇文章是對goto語句的替代實現(xiàn)方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網(wǎng)7342020-12-03
  • C/C++c++ 單線程實現(xiàn)同時監(jiān)聽多個端口

    c++ 單線程實現(xiàn)同時監(jiān)聽多個端口

    這篇文章主要介紹了c++ 單線程實現(xiàn)同時監(jiān)聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++C/C++經(jīng)典實例之模擬計算器示例代碼

    C/C++經(jīng)典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關(guān)于C/C++經(jīng)典實例之模擬計算器的相關(guān)資料,文中通過示...

    jia150610152021-06-07
  • C/C++C語言實現(xiàn)電腦關(guān)機程序

    C語言實現(xiàn)電腦關(guān)機程序

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)電腦關(guān)機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內(nèi)存中的數(shù)據(jù)都是暫時的,當程序結(jié)束時,它們都將丟失,為了永久性的保存大量的數(shù)據(jù),C語言提供了對文件的操作,這篇文章主要給大家介紹了關(guān)于C語言中文件...

    針眼_6702022-01-24
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數(shù)使用

    詳解c語言中的 strcpy和strncpy字符串函數(shù)使用

    strcpy 和strcnpy函數(shù)是字符串復制函數(shù)。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數(shù)使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
主站蜘蛛池模板: 亚洲国产综合另类视频 | 亚洲视频一区二区在线观看 | 99自拍网 | 亚洲精品乱码久久久久久蜜桃 | 国产区香蕉精品系列在线观看不卡 | 色综合网亚洲精品久久 | 国模人体aⅴ | 胸大的姑娘中文字幕视频 | 男人的天堂久久精品激情a 男人的天堂va | 国产中文字幕 | 女人肮脏的交易中文字幕未删减版 | 亚洲乱码一区二区三区国产精品 | 翁公与小莹在客厅激情 | 激情影院网站 | 四虎国产免费 | 免费一级欧美片在线观免看 | 美国雪白人妖sarina | 午夜精品久久久久久久99蜜桃i | 成人欧美视频在线看免费 | 娇妻被又大又粗又长又硬好爽 | 日韩毛片网 | 深夜在线观看 | 波多野结衣家庭教师 | 高h辣文小说网 烧书阁 | 精品综合久久久久久97超人 | 免费在线视频成人 | 国产亚洲视频在线 | 午夜一区二区免费视频 | 被巨大黑人的翻白眼 | 猫咪免费人成网站在线观看入口 | 91美女在线 | 韩国三级年轻的小婊孑 | 国产自拍影院 | 欧美三级小说 | 免费人成在线观看 | 国产精品成人扳一级aa毛片 | 日本精品久久久久久久久免费 | 欧美久在线观看在线观看 | 91亚洲精品丁香在线观看 | 国产成人精品一区二区仙踪林 | 精品国产自在现线拍400部 |