当前位置:网站首页>MySQL C语言连接
MySQL C语言连接
2022-07-20 02:59:00 【小倪同学 -_-】
文章目录
MySQL连接准备
要使用C语言连接mysql,需要使用mysql官网提供的库,大家可以去官网下载
我们使用C接口库来进行连接
要正确使用,我们需要做一些准备工作:
- 保证mysql服务有效
- 在官网上下载合适自己平台的mysql connect库,以备后用
mysql接口介绍
初始化mysql_init()
要使用库,必须先进行初始化
语法
MYSQL *mysql_init(MYSQL *mysql);
示例
MYSQL *mfp = mysql_init(NULL)
链接数据库mysql_real_connect
初始化完毕之后,必须先链接数据库,再进行后续操作。(mysql网络部分是基于TCP/IP的)
语法
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是 C api中一个非常重要的变量(mysql_init的返回值),里面内存非常丰富,有port,dbname,charset等连接基本参数。它也包含了一个叫 st_mysql_methods的结构体变量,该变量里面保存着很多函数指针,这些函数指针将会在数据库连接成功以后的各种数据操作中被调用。
- host是主机名或IP地址,若host是NULL或字符串"localhost",连接将被视为与本地主机的连接。
- user参数包含用户的MySQL登录ID。如果user是NULL,用户将被视为当前用户。
- passwd参数是用户的密码。
- db是数据库名称
- port是端口号
- unix_socket正常设置为NULL,如果不是NULL,该字符串描述了应使用的套接字或命名管道
- client_flag的值通常为0,也能将其设置为下述标志的组合,以允许特定功能。
返回值:
如果连接成功,返回MYSQL*连接句柄(与第1个参数的值相同)。如果连接失败,返回NULL。。
下发mysql命令mysql_query
语法
int mysql_query(MYSQL *mysql, const char *q);
参数介绍
- mysql_init的返回值
- q为要执行的sql语句,如“select * from table”。
获取执行结果mysql_store_result
sql执行完以后,如果是查询语句,我们当然还要读取数据,如果update,insert等语句,那么就看下操作成功与否即可。我们来看看如何获取查询结果: 如果mysql_query返回成功,那么我们就通过mysql_store_result这个函数来读取结果。原型如下:
MYSQL_RES *mysql_store_result(MYSQL *mysql);
该函数会调用MYSQL变量中的st_mysql_methods中的 read_rows 函数指针来获取查询的结果。同时该函数会返回MYSQL_RES 这样一个变量,该变量主要用于保存查询的结果。同时该函数malloc了一片内存空间来存储查询过来的数据,所以我们一定要 free(result),不然是肯定会造成内存泄漏的。 执行完mysql_store_result以后,其实数据都已经在MYSQL_RES 变量中了,下面的api基本就是读取MYSQL_RES 中的数据。
获取结果行数mysql_num_rows
my_ulonglong mysql_num_rows(MYSQL_RES *res);
获取结果列数mysql_num_fields
unsigned int mysql_num_fields(MYSQL_RES *res);
获取列名mysql_fetch_fields
MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);
打印列名
int fields = mysql_num_fields(res);
MYSQL_FIELD *field = mysql_fetch_fields(res);
int i = 0;
for(; i < fields; i++){
cout<<field[i].name<<" ";
}
cout<<endl;
获取结果内容mysql_fetch_row
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
它会返回一个MYSQL_ROW变量,MYSQL_ROW其实就是char **.相当于一个二维数组。
例
i = 0;
MYSQL_ROW line;
for(; i < nums; i++){
line = mysql_fetch_row(res);
int j = 0;
for(; j < fields; j++){
cout<<line[j]<<" ";
}
cout<<endl;
}
关闭mysql链接mysql_close
void mysql_close(MYSQL *sock);
连接示例
#include <iostream>
#include <string>
#include <mysql/mysql.h>
const std::string host = "127.0.0.1";
const std::string user = "abc";
const std::string passwd = "123456";
const std::string db = "test";
const unsigned int port = 3306;
int main()
{
// 1. 初始化mysql句柄
MYSQL *my = mysql_init(nullptr);
if (my == nullptr)
{
std::cerr << "init mysql error" << std::endl;
return 1;
}
// 2. 链接数据库
if (mysql_real_connect(my, host.c_str(), user.c_str(),
passwd.c_str(), db.c_str(),
port, nullptr, 0) == nullptr)
{
std::cerr << "connect mysql error" << std::endl;
return 2;
}
mysql_set_character_set(my, "utf8");// 设置打印格式
// 3. 构建sql(相当于一条sql语句)
std::cout << "connect success" << std::endl;
std::string sql = "insert into students (sn, name, qq) values (";
sql += "2222, \'jimmy\', \'12345678'";
sql += ")";
std::string sql = "delete from students where id=109";
std::string sql = "update students set name=\'tom\' where id=111";
std::cout << "excute: " << sql << std::endl;
std::string sql = "select * from students where id = 108";
// 4. 下达sql命令,mysql会自动执行,reuslt == 0,表明操作成功,其他的标识失败
if (0 != mysql_query(my, sql.c_str()))
{
std::cout << sql << " execute error" << std::endl;
return 3;
}
std::cout << "execute " << sql << " success!" << std::endl;
// 5. select 最特殊,也是最难的,因为还要进行数据分析,得出select的数据!
MYSQL_RES *result = mysql_store_result(my);
int rows = mysql_num_rows(result);
int cols = mysql_num_fields(result);
std::cout << "rows: " << rows << " cols: " << cols << std::endl;
MYSQL_FIELD *f = mysql_fetch_fields(result);
for (int i = 0; i < cols; i++)
{
std::cout << f[i].name << "\t";
}
std::cout << "\n";
//读取我选择的数据
MYSQL_ROW row;
for (int i = 0; i < rows; i++)
{
row = mysql_fetch_row(result);
for(int j = 0; j < cols; j++)
{
std::cout << row[j] << "\t";
}
std::cout << std::endl;
}
free(result);
mysql_close(my);
return 0;
}
边栏推荐
- 【琐琐碎碎小知识】 关于部分Unity编辑器在创建瓦片地图时缺乏Tiles选项
- Scala foundation [high order function programming]
- 技术干货 | 解决面试中80%问题,基于MindSpore实现AUC/ROC
- 371页20万字2021版智慧城市信息化综合建设方案
- How to use mitmproxy to get data return in automated testing?
- C语言二叉树+队列实现层次遍历
- 网站引用百度地图,乱码及无图标
- 30-Spark入门之Spark技术栈讲解、分区、系统架构、算子和任务提交方式
- 95页智能工厂数字化、智能化规划、解决方案及建设方案2022
- 【AD学习记录】覆铜
猜你喜欢
分组卷积和深度可分离卷积
Grouping convolution and deep separable convolution
多模态模型 CLIP4Clip 带你实现文本与视频互搜
【upload靶场12-16】截断、图片马
服务器的1U、2U、4U是指什么?
Using TinyMCE rich text editor in vscode
10 port scanning tools for advanced scanning by network administrators
测试岗面试,一份好的简历总可以让人眼前一亮
使用OpenCV调整图像的亮度和对比度
Understanding and applying continuous integration Tekton
随机推荐
LVS群集应用
【腾讯位置组件】 微信公众号h5 调用腾讯地图组件
过滤器和拦截器区别
测试岗面试,一份好的简历总可以让人眼前一亮
C语言入门实战(9):完数判断
371 pages of 200000 words 2021 smart city informatization comprehensive construction plan
C语言实现二叉树的三种遍历
After reading this article, you should thoroughly understand how to do interface testing
95 pages intelligent factory digitalization, intelligent planning, solutions and construction scheme 2022
买服务器需要看哪些参数,如何看服务器配置
多模态模型 CLIP4Clip 带你实现文本与视频互搜
【obs】Transform: fit to screen
C语言实现二叉树线索化
如何在自动化测试中使用MitmProxy获取数据返回?
视频25-7章2节VGG 26-NiN 27-GooLeNet
APScheduler怎么设置任务不并发
vben-admin 时间选择器相关配置以及设置不可选择的时间
字典序-公司命名
10 个用于网络管理员进行高级扫描的端口扫描工具
C语言_结构体引入