赞
踩
要使用C语言连接MySQL,需要使用MySQL官网提供的库。
下载库文件
首先,进入MySQL官网,选择DEVELOPER ZONE(开发人员专区),然后点击MySQL Downloads。如下:
接下来选择Download Archives。如下:
因为我们是要使用C语言连接MySQL,所以这里选择MySQL Connector/C。如下:
最后选择适合自己平台的mysql connect库,然后点击下载就行了。如下:
上传到云服务器
因为我下载的是Linux下使用的库文件,因此下载完毕后需要将其上传到云服务器,我准备将下载的库文件存放在一个名为thirdPath的目录下。如下:
使用rz -E
命令将刚才下载的库文件上传到云服务器。如下:
然后使用tar
命令将压缩包解压到当前目录下。如下:
为了方便后面演示,这里使用mv
命令将解压后的目录名称改短一点。如下:
进入解压后的目录当中,可以看到有一个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当中的内容如下:
说明一下:
-I
:用于指明头文件的搜索路径。-L
:用于指明库文件的搜索路径。-l
:用于指明需要连接库文件路径下的哪一个库。Makefile编写完毕后,直接通过make命令即可编译代码生成可执行程序。如下:
但此时生成的可执行程序还不能直接运行,通过ldd命令可以看到,该可执行程序所依赖的mysqlclient库找不到。如下:
原因如下:
-I
,-L
和-l
这三个选项,只是在编译期间告诉编译器头文件和库文件在哪里,而可执行程序生成后就与编译器无关了。解决该问题通常有三种做法:
/lib64
。LD_LIBRARY_PATH
环境变量中,该环境变量可以用于指定查找动态库时的其他路径。/etc/ld.so.conf.d/
目录下,并使用ldconfig
命令对配置文件进行更新,该目录下所有配置文件中的路径也将作为查找动态库时的搜索路径。这里我们采用第三种方式进行解决。如下:
此时该可执行程序所依赖的mysqlclient库就能够被找到了。如下:
运行可执行程序后,可以看到客户端的版本为6.1.11,也就是刚才下载的库文件的版本。如下:
至此库已经成功被引入,剩下就是库接口的使用问题了。
创建MySQL对象
在连接数据库之前,需要先创建一个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);
参数说明:
"127.0.0.1"
表示连接本地MySQL服务器。返回值说明:
关闭数据库连接
与数据库交互完毕后,需要关闭数据库连接,关闭数据库连接的函数如下:
void mysql_close(MYSQL *sock);
说明一下:
连接示例
比如使用如下代码连接我的MySQL服务器:
#include <iostream> #include <string> #include <mysql.h> using namespace std; const string host = "49.232.66.206"; const string user = "dragon"; const string passwd = "3524nwe@ytkrSJTEW"; 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; }
使用make命令生成可执行程序,运行后即可看到连接数据库成功、关闭数据库成功。如下:
下发SQL请求
与数据库建立连接期间,就可以向MySQL服务器下发SQL请求,下发SQL请求的函数如下:
int mysql_query(MYSQL *mysql, const char *q);
参数说明:
返回值说明:
设置编码格式
在连接数据库之后,需要统一客户端和服务器的编码格式,避免在数据交互过程中出现乱码,设置编码格式的函数如下:
int mysql_set_character_set(MYSQL *mysql, const char *csname);
参数说明:
"utf8"
。返回值说明:
测试表介绍
下面在与MySQL数据库交互时,访问的都是connect_demon数据库,该数据库下有一个user表,表中有三条记录。如下:
向数据库中插入数据
在调用mysql_query函数时,向MySQL服务器下发一条insert SQL。如下:
#include <iostream> #include <string> #include <mysql.h> using namespace std; const string host = "49.232.66.206"; const string user = "dragon"; const string passwd = "3524nwe@ytkrSJTEW"; 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; }
使用make命令生成可执行程序,运行后在MySQL中即可看到对应数据被成功插入。如下:
删除数据库中的数据
在调用mysql_query函数时,向MySQL服务器下发一条delete SQL。如下:
#include <iostream> #include <string> #include <mysql.h> using namespace std; const string host = "49.232.66.206"; const string user = "dragon"; const string passwd = "3524nwe@ytkrSJTEW"; 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 = "delete from user where id=4"; if(mysql_query(ms, sql.c_str()) != 0) { cout<<"删除数据失败!"<<endl; return 2; } cout<<"删除数据成功!"<<endl; //4、关闭数据库 mysql_close(ms); cout<<"数据库关闭成功!"<<endl; return 0; }
使用make命令生成可执行程序,运行后在MySQL中即可看到对应数据被成功删除。如下:
修改数据库中的数据
在调用mysql_query函数时,向MySQL服务器下发一条update SQL。如下:
#include <iostream> #include <string> #include <mysql.h> using namespace std; const string host = "49.232.66.206"; const string user = "dragon"; const string passwd = "3524nwe@ytkrSJTEW"; 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 = "update user set age=22 where id=1"; if(mysql_query(ms, sql.c_str()) != 0) { cout<<"修改数据失败!"<<endl; return 2; } cout<<"修改数据成功!"<<endl; //4、关闭数据库 mysql_close(ms); cout<<"数据库关闭成功!"<<endl; return 0; }
使用make命令生成可执行程序,运行后在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 = "49.232.66.206"; const string user = "dragon"; const string passwd = "3524nwe@ytkrSJTEW"; const string db = "connect_demon"; const int port = 3306; int main() { //1、获取MySQL实例(相当于给我们创建了一个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、查询数据库表中的记录 //a、执行查询语句 std:string sql = "select * from user"; if(mysql_query(ms, sql.c_str()) != 0) { cout<<"查询数据失败!"<<endl; return 2; } cout<<"查询数据成功!"<<endl; //b、获取查询结果 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; }
使用make命令生成可执行程序,运行后在即可看到数据的查询结果。如下:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。