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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 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
相关文章
|
8天前
|
关系型数据库 MySQL 数据库
Python处理数据库:MySQL与SQLite详解 | python小知识
本文详细介绍了如何使用Python操作MySQL和SQLite数据库,包括安装必要的库、连接数据库、执行增删改查等基本操作,适合初学者快速上手。
71 15
|
2天前
|
SQL 关系型数据库 MySQL
数据库数据恢复—Mysql数据库表记录丢失的数据恢复方案
Mysql数据库故障: Mysql数据库表记录丢失。 Mysql数据库故障表现: 1、Mysql数据库表中无任何数据或只有部分数据。 2、客户端无法查询到完整的信息。
|
9天前
|
关系型数据库 MySQL 数据库
数据库数据恢复—MYSQL数据库文件损坏的数据恢复案例
mysql数据库文件ibdata1、MYI、MYD损坏。 故障表现:1、数据库无法进行查询等操作;2、使用mysqlcheck和myisamchk无法修复数据库。
|
13天前
|
SQL 关系型数据库 MySQL
MySQL导入.sql文件后数据库乱码问题
本文分析了导入.sql文件后数据库备注出现乱码的原因,包括字符集不匹配、备注内容编码问题及MySQL版本或配置问题,并提供了详细的解决步骤,如检查和统一字符集设置、修改客户端连接方式、检查MySQL配置等,确保导入过程顺利。
|
12天前
|
缓存 物联网 数据库
InfluxDB vs TDengine :2025 年了,谁家用的数据库还不能高效读缓存?
在工业互联网和物联网的大数据应用场景中,实时数据的写入和查询性能至关重要。如何快速获取最新设备状态并实时处理数据,直接影响到业务的高效运转。本文将深入分析 TDengine 和 InfluxDB 在缓存机制上的差异,帮助读者更好地理解这两款主流时序数据库在性能优化方面的优劣。
39 1
|
18天前
|
关系型数据库 MySQL 网络安全
DBeaver连接MySQL提示Access denied for user ‘‘@‘ip‘ (using password: YES)
“Access denied for user ''@'ip' (using password: YES)”错误通常与MySQL用户权限配置或网络设置有关。通过检查并正确配置用户名和密码、用户权限、MySQL配置文件及防火墙设置,可以有效解决此问题。希望本文能帮助您成功连接MySQL数据库。
32 4
|
19天前
|
数据库连接 Linux Shell
Linux下ODBC与 南大通用GBase 8s数据库的无缝连接配置指南
本文详细介绍在Linux系统下配置GBase 8s数据库ODBC的过程,涵盖环境变量设置、ODBC配置文件编辑及连接测试等步骤。首先配置数据库环境变量如GBASEDBTDIR、PATH等,接着修改odbcinst.ini和odbc.ini文件,指定驱动路径、数据库名称等信息,最后通过catalog.c工具或isql命令验证ODBC连接是否成功。
|
19天前
|
JSON JavaScript 关系型数据库
node.js连接GBase 8a 数据库 并进行查询代码示例
node.js连接GBase 8a 数据库 并进行查询代码示例
|
21天前
|
关系型数据库 MySQL 数据库
GBase 数据库如何像MYSQL一样存放多行数据
GBase 数据库如何像MYSQL一样存放多行数据
|
1月前
|
SQL 关系型数据库 MySQL
12 PHP配置数据库MySQL
路老师分享了PHP操作MySQL数据库的方法,包括安装并连接MySQL服务器、选择数据库、执行SQL语句(如插入、更新、删除和查询),以及将结果集返回到数组。通过具体示例代码,详细介绍了每一步的操作流程,帮助读者快速入门PHP与MySQL的交互。
36 1