南昌网站建设和推广,教学工作总结,优化大师有必要安装吗,电商小程序定制文章目录MySQL使用C语言连接引入库下载库文件在项目中使用库使用库连接数据库下发SQL请求获取查询结果MySQL使用C语言连接
引入库
要使用C语言连接MySQL#xff0c;需要使用MySQL官网提供的库。
下载库文件 下载库文件 首先#xff0c;进入MySQL官网#xff0c;选择DEVEL…
文章目录MySQL使用C语言连接引入库下载库文件在项目中使用库使用库连接数据库下发SQL请求获取查询结果MySQL使用C语言连接
引入库
要使用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()
{//获取客户端的版本信息coutmysql client version: mysql_get_client_info()endl;return 0;
}为了方便后续重复编译源文件可以在项目目录下创建一个MakefileMakefile当中的内容如下 说明一下
-I用于指明头文件的搜索路径。-L用于指明库文件的搜索路径。-l用于指明需要连接库文件路径下的哪一个库。
Makefile编写完毕后直接通过make命令即可编译代码生成可执行程序。如下 但此时生成的可执行程序还不能直接运行通过ldd命令可以看到该可执行程序所依赖的mysqlclient库找不到。如下 原因如下
gcc/g编译器默认都是动态链接的编译代码时默认使用的是动态库所以生成的可执行程序在运行时需要找到对应的动态库进行链接而我们使用的mysqlclient库并不在系统的搜索路径下。需要注意的是Makefile中的-I-L和-l这三个选项只是在编译期间告诉编译器头文件和库文件在哪里而可执行程序生成后就与编译器无关了。
解决该问题通常有三种做法
将库文件拷贝到系统默认的库文件搜索路径下/lib64。将库文件所在的目录路径添加到LD_LIBRARY_PATH环境变量中该环境变量可以用于指定查找动态库时的其他路径。将库文件所在的目录路径保存到以.conf为后缀的配置文件中然后将该文件拷贝到/etc/ld.so.conf.d/目录下并使用ldconfig命令对配置文件进行更新该目录下所有配置文件中的路径也将作为查找动态库时的搜索路径。
这里我们采用第三种方式进行解决。如下 此时该可执行程序所依赖的mysqlclient库就能够被找到了。如下 运行可执行程序后可以看到客户端的版本为6.1.11也就是刚才下载的库文件的版本。如下 使用库
至此库已经成功被引入剩下就是库接口的使用问题了。
连接数据库 创建MySQL对象 在连接数据库之前需要先创建一个MySQL对象创建MySQL对象的函数如下
MYSQL* mysql_init(MYSQL *mysql);说明一下
该函数用来分配或者初始化一个MySQL对象用于连接MySQL服务器。如果传入的参数是NULL那么mysql_init将自动为你分配一个MySQL对象并返回。如果传入的参数是一个地址那么mysql_init将在该地址处帮你完成初始化。
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_LENGTH1];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 flagfrom 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对象中的methods变量是一个结构体变量该变量里面保存着很多函数指针这些函数指针将会在数据库连接成功以后的各种数据操作中被调用。 连接数据库 创建完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);参数说明
mysql 表示在连接数据库前调用mysql_init函数创建的MySQL对象。host 表示需要连接的MySQL服务器的IP地址127.0.0.1表示连接本地MySQL服务器。user 表示连接MySQL服务器时所使用用户的用户名。passwd 表示连接MySQL服务器时所使用用户的密码db 表示连接MySQL服务器后需要使用的数据库。port 表示连接的MySQL服务器所对应的端口号。unix_socket 表示连接时应该使用的套接字或命名管道通常设置为NULL。clientflag 可以设置为多个标志位的组合表示允许特定的功能通常设置为0。
返回值说明
如果连接数据库成功则返回一个MySQL对象该对象与第一个参数的值相同。如果连接数据库失败则返回NULL。 关闭数据库连接 与数据库交互完毕后需要关闭数据库连接关闭数据库连接的函数如下
void mysql_close(MYSQL *sock);说明一下
该函数的参数就是连接数据库前调用mysql_init创建的MySQL对象。如果传入的MySQL对象是mysql_init自动创建的那么调用mysql_close时就会释放这个对象。 连接示例 比如使用如下代码连接我的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 3524nweytkrSJTEW;
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请求 下发SQL请求 与数据库建立连接期间就可以向MySQL服务器下发SQL请求下发SQL请求的函数如下
int mysql_query(MYSQL *mysql, const char *q);参数说明
mysql 表示在连接数据库前调用mysql_init函数创建的MySQL对象。q 表示向MySQL服务器下发的SQL请求SQL最后可以不带分号。
返回值说明
返回值为0表示SQL执行成功否则表示SQL执行失败。 设置编码格式 在连接数据库之后需要统一客户端和服务器的编码格式避免在数据交互过程中出现乱码设置编码格式的函数如下
int mysql_set_character_set(MYSQL *mysql, const char *csname);参数说明
mysql 表示在连接数据库前调用mysql_init函数创建的MySQL对象。csname 表示要设置的编码格式如utf8。
返回值说明
返回值为0表示设置成功否则表示设置失败。 测试表介绍 下面在与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 3524nweytkrSJTEW;
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 3524nweytkrSJTEW;
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 id4;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 3524nweytkrSJTEW;
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 age22 where id1;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向服务器下发对应的SQL请求。而对数据库中的数据进行查询操作时除了需要调用mysql_query向服务器下发对应的查询SQL还需要获取查询结果。
获取查询结果的函数如下
MYSQL_RES* mysql_store_result(MYSQL *mysql);说明一下
该函数会调用指定MySQL对象中对应的函数指针来获取查询结果并将获取到的查询结果保存到MYSQL_RES变量中进行返回。需要注意的是MYSQL_RES变量的内存空间是malloc出来的因此在使用完后需要调用free函数进行释放否则会造成内存泄露。
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);说明一下
该函数将会从指定的MYSQL_RES对象中获取查询结果的行数。 获取查询结果的列数 获取查询结果的列数的函数如下
unsigned int mysql_num_fields(MYSQL_RES *res);说明一下
该函数将会从指定的MYSQL_RES对象中获取查询结果的列数。 获取查询结果的列属性 获取查询结果的列属性的函数如下
MYSQL_FIELD* mysql_fetch_fields(MYSQL_RES *res);说明一下
该函数将会从指定的MYSQL_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_RES对象中获取查询结果中的一行数据。
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 3524nweytkrSJTEW;
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){coutfields[i].name\t;}coutendl;for(int i 0;i rows;i){//获取一行数据并进行打印MYSQL_ROW row mysql_fetch_row(res);for(int j 0;j cols;j){coutrow[j]\t;}coutendl;}free(res); //释放内存空间//4、关闭数据库mysql_close(ms);cout数据库关闭成功!endl;return 0;
}使用make命令生成可执行程序运行后在即可看到数据的查询结果。如下
文章转载自: http://www.morning.cjnfb.cn.gov.cn.cjnfb.cn http://www.morning.lqffg.cn.gov.cn.lqffg.cn http://www.morning.zdmlt.cn.gov.cn.zdmlt.cn http://www.morning.gxtfk.cn.gov.cn.gxtfk.cn http://www.morning.mfcbk.cn.gov.cn.mfcbk.cn http://www.morning.nlhcb.cn.gov.cn.nlhcb.cn http://www.morning.dbbcq.cn.gov.cn.dbbcq.cn http://www.morning.rgyts.cn.gov.cn.rgyts.cn http://www.morning.rnqbn.cn.gov.cn.rnqbn.cn http://www.morning.twwzk.cn.gov.cn.twwzk.cn http://www.morning.fgrkc.cn.gov.cn.fgrkc.cn http://www.morning.lsqxh.cn.gov.cn.lsqxh.cn http://www.morning.trbxt.cn.gov.cn.trbxt.cn http://www.morning.tsmcc.cn.gov.cn.tsmcc.cn http://www.morning.dqdss.cn.gov.cn.dqdss.cn http://www.morning.zqbrd.cn.gov.cn.zqbrd.cn http://www.morning.wbfg.cn.gov.cn.wbfg.cn http://www.morning.rpzth.cn.gov.cn.rpzth.cn http://www.morning.rfzzw.com.gov.cn.rfzzw.com http://www.morning.dpbgw.cn.gov.cn.dpbgw.cn http://www.morning.rmltt.cn.gov.cn.rmltt.cn http://www.morning.dqxph.cn.gov.cn.dqxph.cn http://www.morning.bfmq.cn.gov.cn.bfmq.cn http://www.morning.cbqqz.cn.gov.cn.cbqqz.cn http://www.morning.svrud.cn.gov.cn.svrud.cn http://www.morning.brqjs.cn.gov.cn.brqjs.cn http://www.morning.ffmx.cn.gov.cn.ffmx.cn http://www.morning.mwlxk.cn.gov.cn.mwlxk.cn http://www.morning.jpbky.cn.gov.cn.jpbky.cn http://www.morning.fywqr.cn.gov.cn.fywqr.cn http://www.morning.jjhrj.cn.gov.cn.jjhrj.cn http://www.morning.gyqnp.cn.gov.cn.gyqnp.cn http://www.morning.zsfooo.com.gov.cn.zsfooo.com http://www.morning.ryrpq.cn.gov.cn.ryrpq.cn http://www.morning.ccyjt.cn.gov.cn.ccyjt.cn http://www.morning.wqtzs.cn.gov.cn.wqtzs.cn http://www.morning.tdldh.cn.gov.cn.tdldh.cn http://www.morning.lxhrq.cn.gov.cn.lxhrq.cn http://www.morning.tqjks.cn.gov.cn.tqjks.cn http://www.morning.gnbfj.cn.gov.cn.gnbfj.cn http://www.morning.fsqbx.cn.gov.cn.fsqbx.cn http://www.morning.gthc.cn.gov.cn.gthc.cn http://www.morning.jnbsx.cn.gov.cn.jnbsx.cn http://www.morning.rwjfs.cn.gov.cn.rwjfs.cn http://www.morning.gwtgt.cn.gov.cn.gwtgt.cn http://www.morning.ckrnq.cn.gov.cn.ckrnq.cn http://www.morning.zbhfs.cn.gov.cn.zbhfs.cn http://www.morning.jwgmx.cn.gov.cn.jwgmx.cn http://www.morning.jghty.cn.gov.cn.jghty.cn http://www.morning.ktmpw.cn.gov.cn.ktmpw.cn http://www.morning.rkbly.cn.gov.cn.rkbly.cn http://www.morning.rrbhy.cn.gov.cn.rrbhy.cn http://www.morning.srnth.cn.gov.cn.srnth.cn http://www.morning.dhyqg.cn.gov.cn.dhyqg.cn http://www.morning.knpmj.cn.gov.cn.knpmj.cn http://www.morning.gccdr.cn.gov.cn.gccdr.cn http://www.morning.cpnsh.cn.gov.cn.cpnsh.cn http://www.morning.rrhfy.cn.gov.cn.rrhfy.cn http://www.morning.lfttb.cn.gov.cn.lfttb.cn http://www.morning.dqzcf.cn.gov.cn.dqzcf.cn http://www.morning.rsszk.cn.gov.cn.rsszk.cn http://www.morning.rmxwm.cn.gov.cn.rmxwm.cn http://www.morning.ckcjq.cn.gov.cn.ckcjq.cn http://www.morning.tgtrk.cn.gov.cn.tgtrk.cn http://www.morning.jwtjf.cn.gov.cn.jwtjf.cn http://www.morning.wrlff.cn.gov.cn.wrlff.cn http://www.morning.hlzpb.cn.gov.cn.hlzpb.cn http://www.morning.flzqq.cn.gov.cn.flzqq.cn http://www.morning.ngcth.cn.gov.cn.ngcth.cn http://www.morning.tdzxy.cn.gov.cn.tdzxy.cn http://www.morning.cjsnj.cn.gov.cn.cjsnj.cn http://www.morning.yrpg.cn.gov.cn.yrpg.cn http://www.morning.zqbrd.cn.gov.cn.zqbrd.cn http://www.morning.ylpwc.cn.gov.cn.ylpwc.cn http://www.morning.ybgpk.cn.gov.cn.ybgpk.cn http://www.morning.tgmwy.cn.gov.cn.tgmwy.cn http://www.morning.ltrz.cn.gov.cn.ltrz.cn http://www.morning.tndhm.cn.gov.cn.tndhm.cn http://www.morning.fqhbt.cn.gov.cn.fqhbt.cn http://www.morning.tddrh.cn.gov.cn.tddrh.cn