国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

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

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

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

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

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

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

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

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

API函數(shù)

1.mysql_real_connect()

連接一個(gè)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個(gè)參數(shù)的值相同

2.mysql_query()

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

返回一個(gè)結(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(),一次性地檢索整個(gè)結(jié)果集。該函數(shù)能從服務(wù)器獲得查詢返回的所有行,并將它們保存在客戶端。對于成功檢索了數(shù)據(jù)的每個(gè)查詢(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(),它也不會(huì)導(dǎo)致任何傷害或性能降低。

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);
獲取下一個(gè)表字段的類型,結(jié)束返回NULL。

7.mysql_fetch_row()

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

8.mysql_fetch_field_direct()

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

簡單的學(xué)生信息管理代碼

光看也記不住啊,就用這些函數(shù)寫了一個(gè)學(xué)生信息管理界面,唉,去年這時(shí)候C語言課程設(shè)計(jì),當(dāng)時(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: 98duxm@gmail.com
  > Created Time: 2017年05月28日 星期日 16時(shí)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 << "請輸入要查詢學(xué)生的學(xué)號(hào): ";
  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 << "請輸入要修改同學(xué)的學(xué)號(hào): ";
  ┊  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.添加學(xué)生信息" << endl;
  ┊  cout << "2.查詢學(xué)生信息" << endl;
  ┊  cout << "3.修改學(xué)生信息" << 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: 98duxm@gmail.com
  > Created Time: 2017年05月28日 星期日 22時(shí)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時(shí)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: 98duxm@gmail.com
  > Created Time: 2017年05月28日 星期日 22時(shí)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;
}  

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

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

下面是遇到的問題:
1. 編譯時(shí)出錯(cuò)
沒有那個(gè)文件或目錄

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

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

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

在網(wǎng)上查找到這樣一種格式,
string sql = "INSERT INTO Infor (name,sex,tel,addr,age) values('"+fname+"','"+fsex+"','"+ftel+"','"+faddr+"', "+IntToStr(fage)+");";
然后string類型的可以成功,整型的變量還是不行,我又寫了個(gè)函數(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)大叔很兇,我也很絕望,就寫到這吧,有問題再補(bǔ)充。

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 中文字幕一区在线观看视频 | 久久久www成人免费无遮挡大片 | 日韩电影免费在线观看中文字幕 | 毛片免费观看网址 | 中文字幕在线免费看 | 成人综合av | 国产精品久久久久国产a级 成人a在线视频 | 欧美日韩国产一区二区 | 狠狠插狠狠操 | a在线观看| 黄色片免费在线观看视频 | 欧美一级淫片007 | 免费久草 | 色综合中文| 免费成人在线电影 | 日本精品一区二区三区在线观看视频 | 国产不卡免费视频 | 欧美色图亚洲 | 特黄特色大片免费视频观看 | 国产午夜视频 | 一本大道伊人久久综合 | 中文字幕一区二区三区乱码在线 | 精品国产不卡一区二区三区 | 日韩成人免费在线 | 国产高清美女一级a毛片久久 | 国产成人片 | 久久伊人久久 | 亚洲美女性视频 | 午夜精品久久 | 久久精品成人 | 一级一毛片 | 久久九 | 亚洲免费网站 | 国产精品69久久久久水密桃 | 一级毛片在线播放 | 在线观看黄色电影 | 久草青青| 欧美精品一区二区蜜臀亚洲 | 国外成人在线视频 | 日本狠狠色 | 国产在线91 |