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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 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。如果有需要,可以关注博主一下哦。

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
5天前
|
存储 Oracle 关系型数据库
数据库传奇:MySQL创世之父的两千金My、Maria
《数据库传奇:MySQL创世之父的两千金My、Maria》介绍了MySQL的发展历程及其分支MariaDB。MySQL由Michael Widenius等人于1994年创建,现归Oracle所有,广泛应用于阿里巴巴、腾讯等企业。2009年,Widenius因担心Oracle收购影响MySQL的开源性,创建了MariaDB,提供额外功能和改进。维基百科、Google等已逐步替换为MariaDB,以确保更好的性能和社区支持。掌握MariaDB作为备用方案,对未来发展至关重要。
19 3
|
5天前
|
安全 关系型数据库 MySQL
MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!
《MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!》介绍了MySQL中的三种关键日志:二进制日志(Binary Log)、重做日志(Redo Log)和撤销日志(Undo Log)。这些日志确保了数据库的ACID特性,即原子性、一致性、隔离性和持久性。Redo Log记录数据页的物理修改,保证事务持久性;Undo Log记录事务的逆操作,支持回滚和多版本并发控制(MVCC)。文章还详细对比了InnoDB和MyISAM存储引擎在事务支持、锁定机制、并发性等方面的差异,强调了InnoDB在高并发和事务处理中的优势。通过这些机制,MySQL能够在事务执行、崩溃和恢复过程中保持
23 3
|
5天前
|
SQL 关系型数据库 MySQL
数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog
《数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog》介绍了如何利用MySQL的二进制日志(Binlog)恢复误删除的数据。主要内容包括: 1. **启用二进制日志**:在`my.cnf`中配置`log-bin`并重启MySQL服务。 2. **查看二进制日志文件**:使用`SHOW VARIABLES LIKE &#39;log_%&#39;;`和`SHOW MASTER STATUS;`命令获取当前日志文件及位置。 3. **创建数据备份**:确保在恢复前已有备份,以防意外。 4. **导出二进制日志为SQL语句**:使用`mysqlbinlog`
29 2
|
18天前
|
关系型数据库 MySQL 数据库
Python处理数据库:MySQL与SQLite详解 | python小知识
本文详细介绍了如何使用Python操作MySQL和SQLite数据库,包括安装必要的库、连接数据库、执行增删改查等基本操作,适合初学者快速上手。
130 15
|
12天前
|
SQL 关系型数据库 MySQL
数据库数据恢复—Mysql数据库表记录丢失的数据恢复方案
Mysql数据库故障: Mysql数据库表记录丢失。 Mysql数据库故障表现: 1、Mysql数据库表中无任何数据或只有部分数据。 2、客户端无法查询到完整的信息。
|
19天前
|
关系型数据库 MySQL 数据库
数据库数据恢复—MYSQL数据库文件损坏的数据恢复案例
mysql数据库文件ibdata1、MYI、MYD损坏。 故障表现:1、数据库无法进行查询等操作;2、使用mysqlcheck和myisamchk无法修复数据库。
|
23天前
|
SQL 关系型数据库 MySQL
MySQL导入.sql文件后数据库乱码问题
本文分析了导入.sql文件后数据库备注出现乱码的原因,包括字符集不匹配、备注内容编码问题及MySQL版本或配置问题,并提供了详细的解决步骤,如检查和统一字符集设置、修改客户端连接方式、检查MySQL配置等,确保导入过程顺利。
|
28天前
|
关系型数据库 MySQL 网络安全
DBeaver连接MySQL提示Access denied for user ‘‘@‘ip‘ (using password: YES)
“Access denied for user ''@'ip' (using password: YES)”错误通常与MySQL用户权限配置或网络设置有关。通过检查并正确配置用户名和密码、用户权限、MySQL配置文件及防火墙设置,可以有效解决此问题。希望本文能帮助您成功连接MySQL数据库。
45 4
|
SQL Java 数据库连接
MySQL---数据库从入门走向大神系列(十五)-Apache的DBUtils框架使用
MySQL---数据库从入门走向大神系列(十五)-Apache的DBUtils框架使用
196 0
MySQL---数据库从入门走向大神系列(十五)-Apache的DBUtils框架使用
|
SQL 关系型数据库 MySQL
MySQL---数据库从入门走向大神系列(六)-事务处理与事务隔离(锁机制)
MySQL---数据库从入门走向大神系列(六)-事务处理与事务隔离(锁机制)
146 0
MySQL---数据库从入门走向大神系列(六)-事务处理与事务隔离(锁机制)