使用C语言实现MySQL的连接
一、引入库
1.1 下载库文件
要使用C语言连接MySQL,需使用MySQL官网提供的库
MySQL :: Download Connector/C++
https://dev.mysql.com/downloads/connector/cpp/
上传到云服务器
下载完毕后将其上传到云服务器即可。下面将下载的库文件解压后存放在一个名为makeuse的目录中
进入解压后的目录中,可以看到有一个include子目录和一个lib子目录
include目录下存放的是一批头文件
bin目录下存放的是动静态库
1.2 在项目中引入库
为了方便在项目中使用刚才的库文件,可以在项目目录下创建两个软连接,分别连接到刚才的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
mysqlConnect:mysqlConnect.cc g++ $^ -o $@ -std=c++11 -I./include -L./lib -lmysqlclient .PHONY:clean clean: rm -rf mysqlConnect
-I:指明头文件的搜索路径
-L:指明库文件的搜索路径
-l:指明需要连接库文件路径下的哪一个库
makefile编写完毕后,使用make命令编译代码生成可执行程序
但此时生成的可执行程序还不能直接运行,通过ldd命令可以发现,该可执行程序所依赖的mysqlclient库找不到
gcc/g++编译器默认都是动态链接,编译代码时默认使用动态库,所以生成的可执行程序在运行时需要找到对应的动态库进行链接,而使用的mysqlclient库并不在系统的搜索路径下
Makefile中的-I,-L和-l这三个选项,只是在编译期间告诉编译器头文件和库文件在哪里,而可执行程序生成后就与编译器无关了
动态库如何使用,在《Linux动静态库》这篇文章中讲解过,不知道如何配置的可以参考下面这篇文章
(28条消息) Linux动静态库_GG_Bond19的博客-****博客
https://blog.****.net/GG_Bruse/article/details/128810497
配置完成后可执行程序所依赖的mysqlclient库就能够被找到了
运行可执行程序后,可以看到客户端的版本为6.1.11,即刚才下载的库文件的版本
二、使用库
2.1 连接数据库
创建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_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对象中的methods变量是一个结构体变量,该变量里面保存着很多函数指针,这些函数指针将会在数据库连接成功以后的各种数据操作中被调用
连接数据库
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时就会释放这个对象
2.2 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表示设置成功,否则表示设置失败
2.3 获取查询结果
对数据库中的数据进行增删改操作时,都只需调用mysql_query向服务器下发对应的SQL请求
而对数据库中的数据进行查询操作时,除了需要调用mysql_query向服务器下发对应的查询SQL,还需获取查询结果
获取查询结果
该函数会调用指定MySQMYSQL_RES* mysql_store_result(MYSQL *mysql);L对象中对应的函数指针来获取查询结果,并将获取到的查询结果保存到MYSQL_RES变量中进行返回
MYSQL_RES变量的内存空间是malloc出来的,因此在使用完后需要调用free函数进行释放,否则会造成内存泄露
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;
获取查询结果的行数
该函数会从指定的MYSQL_RES对象中,获取查询结果的行数
unsigned int mysql_num_fields(MYSQL_RES *res);
获取查询结果的列数
该函数会从指定的MYSQL_RES对象中,获取查询结果的列数
MYSQL_FIELD* mysql_fetch_fields(MYSQL_RES *res);
获取查询结果的列属性
该函数会从指定的MYSQL_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 */
推荐阅读
-
在Linux服务器上使用mysql-front进行远程连接至自己的mysql服务器
-
使用opencv3和C++编程语言实现简单目标跟踪的Tracker
-
C语言编写的2048游戏实现
-
Java 8新特性探究(十三)JavaFX 8新特性以及开发2048游戏-JavaFX历史## 跟java在服务器端和web端成绩相比,桌面一直是java的软肋,于是Sun公司在2008年推出JavaFX,弥补桌面软件的缺陷,请看下图JavaFX一路走过来的改进 从上图看出,一开始推出时候,开发者需使用一种名为JavaFX Script的静态的、声明式的编程语言来开发JavaFX应用程序。因为JavaFX Script将会被编译为Java bytecode,程序员可以使用Java代码代替。 JavaFX 2.0之后的版本摒弃了JavaFX Script语言,而作为一个Java API来使用。因此使用JavaFX平台实现的应用程序将直接通过标准Java代码来实现。 JavaFX 2.0 包含非常丰富的 UI 控件、图形和多媒体特性用于简化可视化应用的开发,WebView可直接在应用中嵌入网页;另外 2.0 版本允许使用 FXML 进行 UI 定义,这是一个脚本化基于 XML 的标识语言。 从JDK 7u6开始,JavaFx就与JDK捆绑在一起了,JavaFX团队称,下一个版本将是8.0,目前所有的工作都已经围绕8.0库进行。这是因为JavaFX将捆绑在Java 8中,因此该团队决定跳过几个版本号,迎头赶上Java 8。 ##JavaFx8的新特性 ## ###全新现代主题:Modena 新的Modena主题来替换原来的Caspian主题。不过在Application的start方法中,可以通过setUserAgentStylesheet(STYLESHEET_CASPIAN)来继续使用Caspian主题。 参考http://fxexperience.com/2013/03/modena-theme-update/ ###JavaFX 3D 在JavaFX8中提供了3D图像处理API,包括Shape3D (Box, Cylinder, MeshView, Sphere子类),SubScene, Material, PickResult, LightBase (AmbientLight 和PointLight子类),SceneAntialiasing等。Camera类也得到了更新。从JavaDoc中可以找到更多信息。 ###富文本 强化了富文本的支持 ###TreeTableView ###日期控件DatePicker 增加日期控件 ###用于 CSS 结构的公共 API
-
C语言实现2048游戏的完整代码
-
使用C语言编写的易懂猜数字游戏
-
「功能优化」:重新设计的猜数字小游戏(C语言实现)
-
C语言实现的猜数字游戏(限制十次机会)
-
C语言实现猜数字游戏的方法有哪些?
-
使用C语言实现奇偶校验