MySQL数据库————数据库与vs的连接(二)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: MySQL数据库————数据库与vs的连接(二)

二、数据库与vs连接的步骤


1、调用mysql_library_init() 初始化MySQL C API库

2、调用mysql_init() 获取或初始化MYSQL结构

3、调用mysql_options() 连接前设置选项

4、调用mysql_real_connect() 连接到MySQL服务器

5、调用mysql_real_query() 执行指定长度的SQL语句(嵌入式SQL)

6、调用mysql_close() 关闭与服务器的连接

7、调用mysql_library_end() 终止MySQL C API库


三、代码实现


1.初始化MySQL C API数据库
MySQLCAPI::MySQLCAPI()
{
  //1、调用mysql_library_init()  初始化MySQL C API库
  if (mysql_library_init(0, nullptr, nullptr))
  { //如果初始化MySQL C API库失败则返回非0值,否则成功返回0
  cout << "初始化MySQL C API库失败!" << endl;
  getchar();
  exit(1); //退出程序
  }
  //2、调用mysql_init()  获取或初始化MYSQL结构
  if (mysql_init(&mysql) == nullptr)
  { //如果获取或初始化MYSQL结构失败则返回null
  cout << "获取或初始化MYSQL结构失败!" << endl;
  getchar();
  exit(1); //退出程序
  }
  //3、调用mysql_options() 连接前设置选项
  if (mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, "gbk"))
  { //连接前设置选项,并设置字符集为"gbk"
  cout << "连接前设置选项失败!" << endl;
  getchar();
  exit(1); //退出程序
  }
}



2.数据库连接函数


bool MySQLCAPI::OpenConnect(const char* host, const char* username, const char* pwd, const char* db_name, unsigned port)
{
  //4、调用mysql_real_connect()  连接到MySQL服务器
  if (mysql_real_connect(&mysql, host, username, pwd, db_name, port, nullptr, 0) == nullptr)
  {
  cout << "连接到MySQL服务器失败!" << endl;
  //getchar();
  //exit(1); //退出程序
  GetErrorinfo(); //获取错误信息函数
  return false;
  }
  return true;
}


3.执行SQl操作


bool MySQLCAPI::ExecuteSQL(const char* sql)
{
  //5、调用mysql_real_query()  执行指定长度的SQL语句(嵌入式SQL)
  if (mysql_real_query(&mysql, sql, strlen(sql)))
  {
  GetErrorinfo();
  return false;
  }
  return true;
}


4.执行SQL查询


//执行SQL查询(有结果集返回)
bool MySQLCAPI::QuerySQL(const char* sql, vector<vector<string>>& resultSet)
{
  //① 执行SQL语句
  //5、调用mysql_real_query()  执行指定长度的SQL语句(嵌入式SQL)
  if (mysql_real_query(&mysql, sql, strlen(sql)))
  {
  GetErrorinfo();
  return false;
  }
  //② 接收查询结果集
  MYSQL_RES* result = mysql_store_result(&mysql);
  //定义一个数据库结果集对象来获取查询结果集
//③ 把结果集对象result中的数据放入vector中
  unsigned rows = (unsigned)mysql_num_rows(result);
  //获取结果集对象的行数,也就是记录(元组)的条数
  unsigned fields = (unsigned)mysql_num_fields(result);
  //获取结果集对象的列数,也就是属性(字段)的个数
  MYSQL_ROW row; //定义一个数据库行对象
  while (row = mysql_fetch_row(result))
  { //循环变量结果集中的每一行
  vector<string> linedata; //定义一个行数组
  for (unsigned i = 0; i < fields; i++)
  {
    if (row[i])
    {
    linedata.push_back(row[i]);
    //数据不为空时,把数据放入临时数组中
    }
    else
    {
    linedata.push_back("");
    //数据为空时,把空字符串放入临时数组中
    }
  }
  resultSet.push_back(linedata);
  //把结果集中的每一行数据放入resultSet中
  }
  mysql_free_result(result); //释放临时结果集
  return true;
}



5.关闭数据库连接


MySQLCAPI::~MySQLCAPI()
{
  //6、调用mysql_close() 关闭与服务器的连接
  mysql_close(&mysql);
  //7、调用mysql_library_end() 终止MySQL C API库
  mysql_library_end();
}


四.源代码呈现


1.类(头文件)


#pragma once
#include "mysql.h" //包含MySQL数据库功能函数头文件
#pragma comment(lib,"libmysql.lib") //包含MySQL连接静态库
#include <string>
using std::string;
#include <vector>
using std::vector;
//1、调用mysql_library_init()  初始化MySQL C API库
//2、调用mysql_init()  获取或初始化MYSQL结构
//3、调用mysql_options() 连接前设置选项
//4、调用mysql_real_connect()  连接到MySQL服务器
//5、调用mysql_real_query()  执行指定长度的SQL语句(嵌入式SQL)
//6、调用mysql_close() 关闭与服务器的连接
//7、调用mysql_library_end() 终止MySQL C API库
class MySQLCAPI
{
  MYSQL mysql; //mysql连接变量:用于连接mysql数据库
public:
  MySQLCAPI();
  ~MySQLCAPI();
  int errornum; //错误码
  string errorinfo; //错误提示信息
  //数据库连接函数
  bool OpenConnect(const char* host, const char* username, const char* pwd, const char* db_name, unsigned port = 0);
  //获取错误信息函数
  void GetErrorinfo();
  //执行SQL操作(没有结果集返回)
  bool ExecuteSQL(const char* sql);
  //执行SQL查询(有结果集返回)
  bool QuerySQL(const char* sql, vector<vector<string>>& resultSet);
};




2.类(cpp文件实现头文件功能)


#define _CRT_SECURE_NO_WARNINGS 1
#include "MySQLCAPI.h"
#include <iostream>
#include <string>
using namespace std;
MySQLCAPI::MySQLCAPI()
{
  //1、调用mysql_library_init()  初始化MySQL C API库
  if (mysql_library_init(0, nullptr, nullptr))
  { //如果初始化MySQL C API库失败则返回非0值,否则成功返回0
  cout << "初始化MySQL C API库失败!" << endl;
  getchar();
  exit(1); //退出程序
  }
  //2、调用mysql_init()  获取或初始化MYSQL结构
  if (mysql_init(&mysql) == nullptr)
  { //如果获取或初始化MYSQL结构失败则返回null
  cout << "获取或初始化MYSQL结构失败!" << endl;
  getchar();
  exit(1); //退出程序
  }
  //3、调用mysql_options() 连接前设置选项
  if (mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, "gbk"))
  { //连接前设置选项,并设置字符集为"gbk"
  cout << "连接前设置选项失败!" << endl;
  getchar();
  exit(1); //退出程序
  }
}
MySQLCAPI::~MySQLCAPI()
{
  //6、调用mysql_close() 关闭与服务器的连接
  mysql_close(&mysql);
  //7、调用mysql_library_end() 终止MySQL C API库
  mysql_library_end();
}
//数据库连接函数
bool MySQLCAPI::OpenConnect(const char* host, const char* username, const char* pwd, const char* db_name, unsigned port)
{
  //4、调用mysql_real_connect()  连接到MySQL服务器
  if (mysql_real_connect(&mysql, host, username, pwd, db_name, port, nullptr, 0) == nullptr)
  {
  cout << "连接到MySQL服务器失败!" << endl;
  //getchar();
  //exit(1); //退出程序
  GetErrorinfo(); //获取错误信息函数
  return false;
  }
  return true;
}
//获取错误信息函数
void MySQLCAPI::GetErrorinfo()
{
  errornum = mysql_errno(&mysql); //获取错误码
  errorinfo = mysql_error(&mysql); //获取错误提示信息
  cout << "\nerror num:" << errornum << "\nerror info:" << errorinfo << endl;
  getchar();
}
//执行SQL操作(没有结果集返回)
bool MySQLCAPI::ExecuteSQL(const char* sql)
{
  //5、调用mysql_real_query()  执行指定长度的SQL语句(嵌入式SQL)
  if (mysql_real_query(&mysql, sql, strlen(sql)))
  {
  GetErrorinfo();
  return false;
  }
  return true;
}
//执行SQL查询(有结果集返回)
bool MySQLCAPI::QuerySQL(const char* sql, vector<vector<string>>& resultSet)
{
  //① 执行SQL语句
  //5、调用mysql_real_query()  执行指定长度的SQL语句(嵌入式SQL)
  if (mysql_real_query(&mysql, sql, strlen(sql)))
  {
  GetErrorinfo();
  return false;
  }
  //② 接收查询结果集
  MYSQL_RES* result = mysql_store_result(&mysql);
  //定义一个数据库结果集对象来获取查询结果集
//③ 把结果集对象result中的数据放入vector中
  unsigned rows = (unsigned)mysql_num_rows(result);
  //获取结果集对象的行数,也就是记录(元组)的条数
  unsigned fields = (unsigned)mysql_num_fields(result);
  //获取结果集对象的列数,也就是属性(字段)的个数
  MYSQL_ROW row; //定义一个数据库行对象
  while (row = mysql_fetch_row(result))
  { //循环变量结果集中的每一行
  vector<string> linedata; //定义一个行数组
  for (unsigned i = 0; i < fields; i++)
  {
    if (row[i])
    {
    linedata.push_back(row[i]);
    //数据不为空时,把数据放入临时数组中
    }
    else
    {
    linedata.push_back("");
    //数据为空时,把空字符串放入临时数组中
    }
  }
  resultSet.push_back(linedata);
  //把结果集中的每一行数据放入resultSet中
  }
  mysql_free_result(result); //释放临时结果集
  return true;
}


3.源程序文件


#include <iostream>
#include <string>
using namespace std;
#include "MySQLCAPI.h" 
void MySQLConnectTest();
int main()
{
  MySQLConnectTest();
  system("pause");
  return 0;
}
void MySQLConnectTest()
{
  MySQLCAPI MySQL_Connect;
  MySQL_Connect.OpenConnect("localhost", "root", "123456", "db_2");
  string sql = "use db_2;";
  vector<vector<string>> data;
  MySQL_Connect.ExecuteSQL(sql.c_str());
  //sql = "insert into db_2.student values(null,\"����\",103,'��',24);";
  //MySQL_Connect.ExecuteSQL(sql.c_str()); 
  sql = "select * from db_2.student;";
  MySQL_Connect.QuerySQL(sql.c_str(), data);
  for (unsigned i = 0; i < data.size(); i++)
  {
  for (unsigned j = 0; j < data[i].size(); j++)
  {
    cout << data[i][j] << '\t';
  }
  cout << endl;
  }
}



总结


数据库与VS的连接类容就到此结束了,我们的数据库知识点也讲解的差不多了,后面就是MySQL数据库的题目讲解了。也会持续更新win32和mfc。如果有需要,可以关注博主一下哦。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
7天前
|
存储 关系型数据库 MySQL
Mysql(4)—数据库索引
数据库索引是用于提高数据检索效率的数据结构,类似于书籍中的索引。它允许用户快速找到数据,而无需扫描整个表。MySQL中的索引可以显著提升查询速度,使数据库操作更加高效。索引的发展经历了从无索引、简单索引到B-树、哈希索引、位图索引、全文索引等多个阶段。
38 3
Mysql(4)—数据库索引
|
23小时前
|
存储 关系型数据库 MySQL
如何在MySQL中创建数据库?
【10月更文挑战第16天】如何在MySQL中创建数据库?
|
4天前
|
SQL Oracle 关系型数据库
安装最新 MySQL 8.0 数据库(教学用)
安装最新 MySQL 8.0 数据库(教学用)
33 4
|
3天前
|
存储 SQL 关系型数据库
【入门级教程】MySQL:从零开始的数据库之旅
本教程面向零基础用户,采用通俗易懂的语言和丰富的示例,帮助你快速掌握MySQL的基础知识和操作技巧。内容涵盖SQL语言基础(SELECT、INSERT、UPDATE、DELETE等常用语句)、使用索引提高查询效率、存储过程等。适合学生、开发者及数据库爱好者。
11 0
【入门级教程】MySQL:从零开始的数据库之旅
|
6天前
|
存储 关系型数据库 MySQL
PACS系统 中 dicom 文件在mysql 8.0 数据库中的 存储和读取(pydicom 库使用)
PACS系统 中 dicom 文件在mysql 8.0 数据库中的 存储和读取(pydicom 库使用)
13 2
|
6天前
|
Java 关系型数据库 MySQL
【编程基础知识】Eclipse连接MySQL 8.0时的JDK版本和驱动问题全解析
本文详细解析了在使用Eclipse连接MySQL 8.0时常见的JDK版本不兼容、驱动类错误和时区设置问题,并提供了清晰的解决方案。通过正确配置JDK版本、选择合适的驱动类和设置时区,确保Java应用能够顺利连接MySQL 8.0。
41 1
|
8天前
|
关系型数据库 MySQL Java
Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
这篇文章是关于如何使用Django框架配置MySQL数据库,创建模型实例,并自动或手动创建数据库表,以及对这些表进行操作的详细教程。
32 0
Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
|
9天前
|
Java 关系型数据库 MySQL
springboot学习五:springboot整合Mybatis 连接 mysql数据库
这篇文章是关于如何使用Spring Boot整合MyBatis来连接MySQL数据库,并进行基本的增删改查操作的教程。
14 0
springboot学习五:springboot整合Mybatis 连接 mysql数据库
|
9天前
|
Java 关系型数据库 MySQL
springboot学习四:springboot链接mysql数据库,使用JdbcTemplate 操作mysql
这篇文章是关于如何使用Spring Boot框架通过JdbcTemplate操作MySQL数据库的教程。
11 0
springboot学习四:springboot链接mysql数据库,使用JdbcTemplate 操作mysql
|
6天前
|
SQL 存储 关系型数据库
mysql 数据库空间统计sql
mysql 数据库空间统计sql
19 0