【C++】C++连接MySQL读取数据

01、目录

02、前言

关于MySQL的介绍,我这里就不多说了,主要是实操。
而添加的头文件和库,由于各个编译器不同,比如Windows和Linux,QT这种肯定都不尽相同,所以,这里也不说。只提一下,我所用到的。

03、利用C++在MySQL中存取数据

以读取数据为例,这里介绍一下步骤(思路):

  1. 第一步,要将你的C++程序与Mysql连接起来,这里要用到函数mysql_real_connect()
  2. 第二步,执行查询语句,这里要用到函数mysql_query()
  3. 查询语句查询到的结果,称为结果集,第三步就是要将结果集中的所有数据,存放在一个变量A中,类型为MYSQL_RES

PS:注意:这个变量中存放的数据,是以“行”和“列”为结构的,也就是一整个表。
例:

身份证号(ID number)姓名 (name)性别(sex)余额(balance)
500101199602158846Mike111.000.000
50010119960224599xChike999.999.999
  1. 虽然所有数据都存放进了上一步的变量A中,但你还不能把A作为一个整体输出到屏幕上,而需要另一个变量B,类型为MYSQL_ROW,变量B类似一个一维数组,一次只能储存一行变量A中的数据,而下标[ ]表示列,假设变量B当前储存了变量A中的第一行,则B[2]就是指这一行的第二列,也就是Mike,将变量A中的一行赋给变量B的函数叫做mysql_fetch_row(),而为了将变量B中储存的数据全部输出到屏幕,则需要用到循环
  2. 最后用完了,要释放内存,并关闭和数据库的连接。

实际上,还有一个最重要的变量,类型为MYSQL(从类型的名字就可以看出来很重要),是必须在第一步之前就声明的,试想,C++程序与Mysql这两个本来毫无关联的东西,是怎么联系起来的呢?如果C++程序在mysql内部,有一个“通信兵”,这个“通信兵”在C++连接mysql时承担重要的作用。而变量A又是怎么储存查询得到的结果集的呢,这也需要这个“通信兵”先在mysql内找到这个结果集的地址,再通过一个函数,mysql_store_result(),把结果集的地址告诉这个函数,让这个函数把这个地址储存的值(也就是结果集),赋给变量A。

上述步骤就是大概的流程了,但是在这之前我们还得做一件事情,因为我是用我的电脑写程序,然后访问另一台PC的MySQL数据库,所以我要配置一些库和头文件(include),步骤如下:

  1. 将远程机器上的mysql安装文件里的include和lib目录复制到本地计算机,如我的远程电脑上的MySQL是默认安装的,所以安装目录就是C:\Program Files\MySQL\MySQL Server 5.7,本地计算机我是拷贝到了D:\app\mysqlCpp目录下,结果如下:
    在这里插入图片描述
    这里请不要纠结MySQL版本,只要是MySQL数据库,都是这样搞,根据我查询的资料来看,目前就是这样。
  2. 打开vs2015,新建空项目,再鼠标右击项目名称,选择属性,在弹出的项目属性窗口的左边栏中选择VC++目录,把刚刚拷贝过来的include和lib文件夹路径分别添加到包含目录和库目录中,具体操作截图如下:
    在这里插入图片描述
  3. 再点击左边选项栏下的链接器,选择输入,在右边框中的附加依赖项后面输入libmysql.lib;,最后点确认。截图如下:
    在这里插入图片描述
  4. 最后还需要将之前拷贝的lib目录下的 libmysql.dll 文件拷贝到项目的根目录下,这一步很重要,因为vs2015就是通过加载动态库文件来连接接远程数据库的。截图如下:
    在这里插入图片描述
    至此,所有的配置操作都完成了,接下来就是进入主题了,介绍API,开始写代码来连接mysql!

04、C++连接MySQL的必要API

4.1变量类型介绍
  • MYSQL:该结构代表1个数据库连接的句柄。几乎所有的MySQL函数均使用它。
  • MYSQL_RES:该结构代表返回行的查询结果(例如SELECT查询语句)。在本节的剩余部分,将查询返回的信息称为“结果集”。(也就是前面提到的变量A)
  • MYSQL_ROW:这是1行数据的“类型安全”表示,行是通过调用mysql_fetch_row()从MYSQL_RES型变量中获得的。(也就是前面提到的变量B)

例如定义一个MYSQL_RES和一个MYSQL_ROW变量,并将MYSQL_RES中的一行赋给MYSQL_ROW变量

MYSQL_RES *result;
MYSQL ROW row;
 
//.....为result赋值部分省略
 
row = mysql_fetch_row(result);
//每成功调用一次mysql_fetch_row(),就滑向下一行,若到达最后一行,则返回NULL
//所以下次调用mysql_fetch_row(result)时,就是将下一行赋给一个MYSQL_ROW变量
4.2 API介绍
  1. mysql_init():用于初始化MYSQL变量
MYSQL * STDCALL mysql_init(MYSQL *mysql); 

成功返回*mysql指针,失败返回NULL。

  1. mysql_real_connect():连接MYSQL
MYSQL * STDCALL mysql_real_connect(MYSQL *mysql, 
                                const char *host,   //MySQL的IP,远程登录输入远程登录的IP地址
                                const char *user,   //登录用户
                                const char *passwd, //登录密码
                                const char *db,     //使用的数据库名称
                                unsigned int port,  //MySQL端口
                                const char *unix_socket,    //是否使用socket机制登录,NULL:否
                                unsigned long clientflag);  //连接标志,通常为0

参数说明:
mysql:初始化的MySQL指针
host:主机名或IP地址,如果“host”是NULL或字符串"localhost"或“127.0.0.1”,连接将被视为与本地主机的连接
user:MySQL登录ID
passwd:用户的密码
db:数据库名称
port:TCP/IP连接的端口号
unix_socket:一般为NULL,不需要了解
clientflag:一般为0,不需要了解

成功返回*mysql指针,失败返回NULL

  1. mysql_query():向数据库发送查询语句
int STDCALL mysql_query(MYSQL *mysql,   //MySQL操作结构体
                        const char *q); //操作命令

参数说明:
mysql:MYSQL变量的地址
q:查询语句:如,select * from movie;
成功返回0,失败返回1

  1. mysql_store_result():将mysql_query()查询到的结果集,赋给MYSQL_RES变量
MYSQL_RES mysql_store_result(MYSQL *mysql); //参数同上说明
  1. mysql_fetch_row():将MYSQL_RES变量中的一行赋给MYSQL_ROW变量,当重复调用mysql_fetch_row()时,将逐个获取结果集的行,到最后一行后返回NULL

  2. mysql_num_fields():获取结果集中的列数,返回值为整型

05、实例运用

5.1 实例1
#include <iostream>
#include <mysql.h>
using namespace std;
 
int main()
{
	MYSQL ceshi; 
 
	mysql_init(&ceshi);   //初始化MYSQL变量
 
	MYSQL_RES *result; 
 
	MYSQL_ROW row;
 
	int num;        //用来存放结果集列数
 
	int i;          
 
 
 
	if (mysql_real_connect(&ceshi, "127.0.0.1", "root", "123", "cardinfo", 3306, NULL, 0))  //连接到mysql
	{
		cout << "\n\t-----MySQL已连接----" << endl;
	}
	
	if (!mysql_query(&ceshi, "SELECT * FROM vips"))   //若查询成功返回0,失败返回随机数
	{
		cout << "\n\t  ----查询成功----" << endl;
	}
 
	result = mysql_store_result(&ceshi);    //将查询到的结果集储存到result中
 
	num = mysql_num_fields(result);        //将结果集列数存放到num中
 
	while ((row = mysql_fetch_row(result)))  //遇到最后一行,则中止循环
	{
		for (i = 0; i < num; i++)         //利用for循环,输出该行的每一列
		{
			cout << row[i]<< "\t";    //row是MYSQL_ROW变量,可以当做数组使用,i为列数
		}
		cout << endl;
	}
	mysql_free_result(result);     //释放结果集所占用的内存
	mysql_close(&ceshi);          //关闭与mysql的连接
    
}

5.2 实例2
#include <iostream>
#include <string>
#include <mysql.h>
#include<iomanip>

using namespace std;

void sqlselect(MYSQL*, const char*);     //测试查询数据 

MYSQL* mysql = NULL;

int main()
{
	//初始化MySQL连接句柄
	mysql = mysql_init((MYSQL*)0);

	mysql_real_connect
	(
		mysql,
		"10.255.60.194", //主机ip地址
		"root", //数据库用户名
		"这里输入你的root用户的密码", //数据库密码
		"要连接的库名", //数据库名称
		3306, //数据库端口,0表示默认端口(即3306)
		NULL, //如果unix_socket不是NULL,字符串指定套接字或应该被使用的命名管道。注意host参数决定连接的类型
		0 //通常是0
	);

	if (!mysql) //连接失败
	{
		cout << "Connection error: " << mysql_errno(mysql) 
			 << ", " << mysql_error(mysql) << endl;
	}

	const char* command = "select * from 表名"; //查询指令

	// 改变编码格式
	mysql_set_character_set(mysql, "GB2312");

	sqlselect(mysql, command); //查询数据  

	mysql_close(mysql); //关闭连接  

	return 0;
}

void sqlselect(MYSQL* mysql, const char* command)
{

	int flag = mysql_real_query(mysql, command, strlen(command));

	if (flag)
	{
		cout << "Select error: " << mysql_errno(mysql) << ", " << mysql_error(mysql) << endl;
		return;
	}

	MYSQL_RES* res = mysql_store_result(mysql); //读取将查询结果   
	MYSQL_FIELD* field = mysql_fetch_fields(res); //获取所有列名
	int field_count = mysql_field_count(mysql); //获取列数

												//输出所有列名
	for (int i = 0; i < field_count; i++)
		cout << setw(15) << field[i].name;

	cout << endl;

	//遍历输出每一行数据  
	MYSQL_ROW row;
	while (row = mysql_fetch_row(res))
	{
		for (int i = 0; i < field_count; i++)
			cout << setw(15) << row[i];
		cout << endl;
	}
}

06、总结

上述内容就是C++连接关系型数据库:MySQL的基本内容了。通过上面的步骤是可以完成基本写操作的。这里,实例均是找的例子,由于,到后面甲方改了,不用MySQL,要用SQL Server 2014 连接,我就没有继续这个思路,先停下来,坚持写完这篇,然后再去研究SQL Server 2014 的连接方式了。

简单介绍就到这里了,谢谢观看!

版权声明:转载请注明出处,谢谢!

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cain Xcy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值