一直找不到关于C/C++连接Mysql数据库的详细api书籍和网站,刷了下网页,找到一篇Linux 下C/C++连接数据库的博客,留着以后自己用。
  首先需要编译、安装MySQL,安装完成后,将MySQL目录中的lib目录添加到环境变量中。新建C/C++工程,把$MYSQL_ROOT/include添加到编译环境的包含路径下面。在编译选项中,增加$MYSQL_ROOT/lib目录。在Link选项中增加-lmysqlclient(已经把lib目录增加到系统环境变量中),或者直接引用libmysqlclient.so文件。
1 不多说了,直接上代码,注释都很详细。
2 /*
3 * MySQLManager.h
4 *
5 *    Created on: Feb 18, 2009
6 *            Author: Steven Wee
7 */
8
9 #ifndef MYSQLMANAGER_H_
10 #define MYSQLMANAGER_H_
11
12 #include "../Common/CheckStringTools.h"
13
14 #include < mysql.h>
15
16 #include < string>
17 #include < iostream>
18 #include < vector>
19
20 #include < string.h>
21
22 using namespace std;
23
24 class MySQLManager
25 {
26 public:
27         /*
28          * Init MySQL
29          * @param hosts:         Host IP address
30
31          * @param userName:        Login UserName
32          * @param password:        Login Password
33          * @param dbName:        Database Name
34          * @param port:                Host listen port number
35          */
36         MySQLManager(std::string hosts, std::string userName, std::string password, std::string dbName, unsigned int port);
37         ~MySQLManager();
38         void initConnection();
39         /*
40          * Making query from database
41          * @param mysql:        MySQL Object
42          * @param sql:                Running SQL command
43          */
44         bool runSQLCommand(std::string sql);
45         /**
46          * Destroy MySQL object
47          * @param mysql                MySQL object
48          */
49         void destroyConnection();
50         bool getConnectionStatus();
51         vector<  vector< string> > getResult();
52 protected:
53         void setUserName(std::string userName);
54         void setHosts(std::string hosts);
55         void setPassword(std::string password);
56         void setDBName(std::string dbName);
57         void setPort(unsigned int port);
58 private:
59         bool IsConnected;
60         vector<  vector< string> > resultList;
61         MYSQL mySQLClient;
62         unsigned int DEFAULTPORT;
63         char * HOSTS;
64         char * USERNAME;
65         char * PASSWORD;
66         char * DBNAME;
67 };
68
69 #endif /* MYSQLMANAGER_H_ */
70
71 /*
72 * MySQLManager.cpp
73 *
74 *    Created on: Feb 18, 2009
75 *            Author: Steven Wee
76 */
77 #include "MySQLManager.h"
78
79 MySQLManager::MySQLManager(string hosts, string userName, string password, string dbName, unsigned int port)
80
81 {
82         IsConnected = false;
83         this ->setHosts(hosts);            //    设置主机IP地址
84         this ->setUserName(userName);            //    设置登录用户名
85         this ->setPassword(password);            //    设置登录密码
86         this ->setDBName(dbName);            //    设置数据库名
87         this ->setPort(port);            //    设置端口
88 }
89
90 MySQLManager::~MySQLManager()
91 {
92         this ->destroyConnection();
93 }
94
95 void MySQLManager::setDBName(string dbName)
96 {
97         if ( dbName.empty() )
98         {//        用户没有指定数据库名
99                 std::cout < <  "DBName is null! Used default value: mysql" < <  std::endl;
100                 this ->DBNAME = new char[5];
101                 strcpy(this ->DBNAME, "mysql");
102         }
103         else
104         {
105                 this ->DBNAME = new char[dbName.length()];
106                 strcpy(this ->DBNAME, dbName.c_str());
107         }
108 }
109
110 void MySQLManager::setHosts(string hosts)
111 {
112         if ( hosts.empty() )
113         {//    用户没有指定数据库IP地址
114                 std::cout < <  "Hosts is null! Used default value: localhost" < <  std::endl;
115                 this ->HOSTS = new char[9];
116                 strcpy(this ->HOSTS, "localhost");
117         }
118         else
119         {
120                 this ->HOSTS = new char[hosts.length()];
121                 strcpy(this ->HOSTS, hosts.c_str());
122         }
123 }
124
125 void MySQLManager::setPassword(string password)
126 {//    用户没有指定密码
127         if ( password.empty() )
128         {
129
130                 std::cout < <  "Password is null! Used default value: " < <  std::endl;
131                 this ->PASSWORD = new char[1];
132                 strcpy(this ->PASSWORD, "");
133         }
134         else
135         {
136                 this ->PASSWORD = new char[password.length()];
137                 strcpy(this ->PASSWORD, password.c_str());
138         }
139 }
140
141 void MySQLManager::setPort(unsigned int port)
142 {//    用户没有指定端口号,使用默认端口号
143         if ( port )
144         {
145                 std::cout < <  "Port number is null! Used default value: 0" < <  std::endl;
146                 this ->DEFAULTPORT = 0;
147         }
148         else
149         {
150                 this ->DEFAULTPORT = port;
151         }
152 }
153
154 void MySQLManager::setUserName(string userName)
155 {//    用户没有指定登录用户名
156         if ( userName.empty() )
157         {
158                 std::cout < <  "UserName is null! Used default value: root" < <  std::endl;
159                 this ->USERNAME = new char[4];
160                 strcpy(this ->USERNAME, "root");
161         }
162         else
163         {
164                 this ->USERNAME = new char[userName.length()];
165                 strcpy(this ->USERNAME, userName.c_str());
166         }
167 }
168
169 void MySQLManager::initConnection()
170 {
171         if ( IsConnected )
172         {//    已经连接到服务器
173                 std::cout < <  "Is connected to server!" < < std::endl;
174                 return;
175         }
176         mysql_init(&mySQLClient);//    初始化相关对象
177         if ( !mysql_real_connect( &mySQLClient, HOSTS, USERNAME, PASSWORD, DBNAME, DEFAULTPORT, NULL, 0) )
178
179         {//    连接到服务器
180                 std::cout < <  "Error connection to database: %s " < <  mysql_error(&mySQLClient) < <  std::endl;
181         }
182         IsConnected = true;//    修改连接标识
183 }
184
185 bool MySQLManager::runSQLCommand(string sql)
186 {
187         if ( !IsConnected )
188         {//    没有连接到服务器
189                 std::cout < <  "Not connect to database!" < <  std::endl;
190                 return false;
191         }
192         if ( sql.empty() )
193         {//    SQL语句为空
194                 std::cout < <  "SQL is null!" < <  std::endl;
195                 return false;
196         }
197
198         MYSQL_RES *res;
199         MYSQL_ROW row;
200
201         unsigned int i,j = 0;
202
203         StringTools stringTools;
204         sql = stringTools.filterString(sql);
205
206         i = mysql_real_query(&mySQLClient,sql.c_str(),(unsigned int)strlen(sql.c_str()));//    执行查询
207         if ( i )
208         {
209                 std::cout < <  "Error query from database: %s " < <  mysql_error(&mySQLClient) < <  std::endl;
210                 return false;
211         }
212         res = mysql_store_result(&mySQLClient);
213         vector< string> objectValue;
214         while( (row = mysql_fetch_row(res)) )
215         {//    遍历结果集
216                 objectValue.clear();
217                 for ( j = 0 ; j <  mysql_num_fields(res) ; j   )
218                 {
219                         objectValue.push_back(row[j]);
220                 }
221                 this ->resultList.push_back(objectValue);
222         }
223         mysql_free_result(res);         //free result after you get the result
224
225
226
227         return true;
228 }
229
230 vector<  vector< string> > MySQLManager::getResult()
231 {
232         return resultList;
233 }
234
235 void MySQLManager::destroyConnection()
236 {
237         mysql_close(&mySQLClient);
238         this ->IsConnected = false;
239 }
240
241 bool MySQLManager::getConnectionStatus()
242 {
243         return IsConnected;
244 }