赞
踩
目录
要使用C/C++连接MySQL,需要使用MySQL官网提供的库。
进入MySQL官网选择适合自己平台的mysql connect库,然后点击下载就行了。
比如此链接MySQL :: Download Connector/C++
下载完毕后需要将其上传到云服务器,这里将下载的库文件存放在下面的目录:
使用rz -E命令将刚才下载的库文件上传到云服务器。
然后使用tar命令将压缩包解压到当前目录下。
进入解压后的目录当中,可以看到有一个include子目录和一个lib子目录。
其中,include目录下存放的一堆头文件。而lib目录下存放的就是动静态库。
为了方便在项目中使用刚才的库文件,可以在项目目录下创建两个软连接,分别连接到刚才的include目录和lib目录。
这时直接在项目目录下,就能看到刚才include和lib目录下的内容。
下面先通过调用mysql_get_client_info来判断库是否引入成功,该函数的作用就是获取客户端的版本信息。
- #include <iostream>
- #include <mysql.h>
- using namespace std;
-
- int main()
- {
- //获取客户端的版本信息
- cout<<"mysql client version: "<<mysql_get_client_info()<<endl;
-
- return 0;
- }
为了方便后续重复编译源文件,可以在项目目录下创建一个Makefile,Makefile当中的内容如下:
Makefile编写完毕后,直接通过make命令即可编译代码生成可执行程序。
但此时生成的可执行程序还不能直接运行,通过ldd命令可以看到,该可执行程序所依赖的mysqlclient库找不到。如下:
解决该问题通常有三种做法:
这里采用第三种方式进行解决。如下:
此时该可执行程序所依赖的mysqlclient库就能够被找到了。如下:
在连接数据库之前,需要先创建一个MySQL对象,创建MySQL对象的函数如下:
MYSQL* mysql_init(MYSQL *mysql);
MYSQL对象中包含了各种信息,其类型定义如下:
- typedef struct st_mysql {
- NET net; /* Communication parameters */
- unsigned char *connector_fd; /* ConnectorFd for SSL */
- char *host,*user,*passwd,*unix_socket,*server_version,*host_info;
- char *info, *db;
- struct charset_info_st *charset;
- MYSQL_FIELD *fields;
- MEM_ROOT field_alloc;
- my_ulonglong affected_rows;
- my_ulonglong insert_id; /* id if insert on table with NEXTNR */
- my_ulonglong extra_info; /* Not used */
- unsigned long thread_id; /* Id for connection in server */
- unsigned long packet_length;
- unsigned int port;
- unsigned long client_flag,server_capabilities;
- unsigned int protocol_version;
- unsigned int field_count;
- unsigned int server_status;
- unsigned int server_language;
- unsigned int warning_count;
- struct st_mysql_options options;
- enum mysql_status status;
- my_bool free_me; /* If free in mysql_close */
- my_bool reconnect; /* set to 1 if automatic reconnect */
-
- /* session-wide random string */
- char scramble[SCRAMBLE_LENGTH+1];
- my_bool unused1;
- void *unused2, *unused3, *unused4, *unused5;
-
- LIST *stmts; /* list of all statements */
- const struct st_mysql_methods *methods;
- void *thd;
- /*
- Points to boolean flag in MYSQL_RES or MYSQL_STMT. We set this flag
- from mysql_stmt_close if close had to cancel result set of this object.
- */
- my_bool *unbuffered_fetch_owner;
- /* needed for embedded server - no net buffer to store the 'info' */
- char *info_buffer;
- void *extension;
- } MYSQL;
创建完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 clientflag);
返回值:
与数据库交互完毕后,需要关闭数据库连接,关闭数据库连接的函数如下:
void mysql_close(MYSQL *sock);
比如使用如下代码连接我的MySQL服务器:
- #include <iostream>
- #include <string>
- #include <mysql.h>
- using namespace std;
-
- const string host = "116.205.138.41";
- const string user = "GR";
- const string passwd = "@369rtxRTX";
- const string db = "connect_demon";
- const int port = 3306;
-
- int main()
- {
- //1、创建MySQL对象
- MYSQL* ms = mysql_init(nullptr);
- //2、连接数据库
- if(mysql_real_connect(ms, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0) == nullptr)
- {
- cerr<<"数据库连接失败"<<endl;
- return 1;
- }
- cout<<"数据库连接成功"<<endl;
-
- //3、关闭数据库
- mysql_close(ms);
- cout<<"数据库关闭成功"<<endl;
- return 0;
- }
使用g++生成可执行程序,运行后即可看到连接数据库成功、关闭数据库成功。
与数据库建立连接期间,就可以向MySQL服务器下发SQL请求,下发SQL请求的函数如下:
int mysql_query(MYSQL *mysql, const char *q);
返回值:
在连接数据库之后,需要统一客户端和服务器的编码格式,避免在数据交互过程中出现乱码,设置编码格式的函数如下:
int mysql_set_character_set(MYSQL *mysql, const char *csname);
返回值:
下面在与MySQL数据库交互时,访问的都是connect_demon数据库,该数据库下有一个user表,表中有三条记录。如下:
在调用mysql_query函数时,向MySQL服务器下发一条insert SQL。如下:
- #include <iostream>
- #include <string>
- #include <mysql.h>
- using namespace std;
-
- const string host = "116.205.138.41";
- const string user = "GR";
- const string passwd = "@369rtxRTX";
- const string db = "connect_demon";
- const int port = 3306;
-
- int main()
- {
- //1、创建MySQL对象
- MYSQL* ms = mysql_init(nullptr);
- //2、连接数据库
- if (mysql_real_connect(ms, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0) == nullptr)
- {
- cerr << "数据库连接失败" << endl;
- return 1;
- }
- cout << "数据库连接成功" << endl;
- mysql_set_character_set(ms, "utf8"); //设置编码格式为utf8
-
- //3、向数据库表中插入记录
- std:string sql = "insert into user values (4,'赵六',25)";
- if (mysql_query(ms, sql.c_str()) != 0)
- {
- cout << "插入数据失败" << endl;
- return 2;
- }
- cout << "插入数据成功" << endl;
-
- //4、关闭数据库
- mysql_close(ms);
- cout << "数据库关闭成功" << endl;
- return 0;
- }
生成可执行程序,运行后在MySQL中即可看到对应数据被成功插入。如下:
删除和更新也和插入的做法一样。
获取查询结果的函数如下:
MYSQL_RES* mysql_store_result(MYSQL *mysql);
MYSQL_RES变量中保存了查询得到的各种信息,其类型定义如下:
- typedef struct st_mysql_res {
- my_ulonglong row_count;
- MYSQL_FIELD *fields;
- MYSQL_DATA *data;
- MYSQL_ROWS *data_cursor;
- unsigned long *lengths; /* column lengths of current row */
- MYSQL *handle; /* for unbuffered reads */
- const struct st_mysql_methods *methods;
- MYSQL_ROW row; /* If unbuffered read */
- MYSQL_ROW current_row; /* buffer to current row */
- MEM_ROOT field_alloc;
- unsigned int field_count, current_field;
- my_bool eof; /* Used by mysql_fetch_row */
- /* mysql_stmt_close() had to cancel this result */
- my_bool unbuffered_fetch_cancelled;
- void *extension;
- } MYSQL_RES;
获取查询结果的行数的函数如下:
my_ulonglong mysql_num_rows(MYSQL_RES *res);
获取查询结果的列数的函数如下:
unsigned int mysql_num_fields(MYSQL_RES *res);
获取查询结果的列属性的函数如下:
MYSQL_FIELD* mysql_fetch_fields(MYSQL_RES *res);
mysql_fetch_fields函数将会返回多个MYSQL_FIELD对象,每个MYSQL_FIELD对象中保存着对应列的各种列属性,其类型定义如下:
- typedef struct st_mysql_field {
- char *name; /* Name of column */
- char *org_name; /* Original column name, if an alias */
- char *table; /* Table of column if column was a field */
- char *org_table; /* Org table name, if table was an alias */
- char *db; /* Database for table */
- char *catalog; /* Catalog for table */
- char *def; /* Default value (set by mysql_list_fields) */
- unsigned long length; /* Width of column (create length) */
- unsigned long max_length; /* Max width for selected set */
- unsigned int name_length;
- unsigned int org_name_length;
- unsigned int table_length;
- unsigned int org_table_length;
- unsigned int db_length;
- unsigned int catalog_length;
- unsigned int def_length;
- unsigned int flags; /* Div flags */
- unsigned int decimals; /* Number of decimals in field */
- unsigned int charsetnr; /* Character set */
- enum enum_field_types type; /* Type of field. See mysql_com.h for types */
- void *extension;
- } MYSQL_FIELD;
获取查询结果中的一行数据的函数如下:
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
MYSQL_ROW对象中保存着一行数据,这一行数据中可能包含多个字符串,对应就是这行数据中的多个列信息,因此MYSQL_ROW本质就是char**类型,其类型定义如下:
typedef char **MYSQL_ROW; /* return data as array of strings */
比如查询user表中的数据并进行打印输出。如下:
- #include <iostream>
- #include <string>
- #include <mysql.h>
- using namespace std;
-
- const string host = "116.205.138.41";
- const string user = "GR";
- const string passwd = "@369rtxRTX";
- const string db = "connect_demon";
- const int port = 3306;
-
- int main()
- {
- //1、创建MySQL对象
- MYSQL* ms = mysql_init(nullptr);
- //2、连接数据库
- if (mysql_real_connect(ms, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0) == nullptr)
- {
- cerr << "数据库连接失败" << endl;
- return 1;
- }
- cout << "数据库连接成功" << endl;
- mysql_set_character_set(ms, "utf8"); //设置编码格式为utf8
-
- 3、向数据库表中插入记录
- //std:string sql = "insert into user values (4,'赵六',25)";
- //if (mysql_query(ms, sql.c_str()) != 0)
- //{
- // cout << "插入数据失败" << endl;
- // return 2;
- //}
- //cout << "插入数据成功" << endl;
-
- //3、查询数据库表中的记录
- //3.1、执行查询语句
- std:string sql = "select * from user";
- if (mysql_query(ms, sql.c_str()) != 0)
- {
- cout << "查询数据失败" << endl;
- return 2;
- }
- cout << "查询数据成功" << endl;
- //3.2、获取查询结果
- MYSQL_RES* res = mysql_store_result(ms);
- int rows = mysql_num_rows(res); //数据的行数
- int cols = mysql_num_fields(res); //数据的列数
- //获取每列的属性并打印列名
- MYSQL_FIELD* fields = mysql_fetch_fields(res);
- for (int i = 0;i < cols;i++)
- {
- cout << fields[i].name << "\t";
- }
- cout << endl;
- for (int i = 0;i < rows;i++)
- {
- //获取一行数据并进行打印
- MYSQL_ROW row = mysql_fetch_row(res);
- for (int j = 0;j < cols;j++)
- {
- cout << row[j] << "\t";
- }
- cout << endl;
- }
- free(res); //释放内存空间
-
- //4、关闭数据库
- mysql_close(ms);
- cout << "数据库关闭成功" << endl;
- return 0;
- }
生成可执行程序,运行后在即可看到数据的查询结果。如下:
此专栏到这就先告一段落了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。