MySQL编程需要包含<mysql.h>头文件。该文件一般在MySQL安装目录下的include文件夹下。

包含头文件还不够,还需要包含“libmysql.lib”库,一般在lib文件夹下。

MySQL编程与Socket编程非常相似,唯一不同的是MySQL使用的是MYSQL结构体,而Socket使用的是SOCKET。因此需要先构建一个MYSQL结构体并初始化(mysql_init),使用完后需要释放该结构体(mysql_close)。

函数详情可查看MYSQL参考手册

下载地址:链接:https://pan.baidu.com/s/1qZ96XtU 密码:zk5l

// MySQL.h

#ifndef C_MYSQL_H // 防止多次包含
#define C_MYSQL_H // 导出/导入函数
#ifdef MYSQL_EXPORTS
#define MYSQLAPI __declspec(dllexport)
#else
#define MYSQLAPI __declspec(dllimport)
#endif // 头文件
#include "stdafx.h"
#include <WinSock2.h>
#include "X:\\Program Files\\MySQL\\MySQL Server 5.5\\include\\mysql.h"
#include <string>
using std::string; #pragma comment(lib, "libmysql.lib")// 链接动态库
#pragma warning(disable:4251)// 屏蔽编译警告
#pragma warning(disable:4267)
#pragma warning(disable:4244) class MYSQLAPI CMySQL
{
public:
CMySQL();
virtual ~CMySQL(); public:
// 返回错误描述
string GetErrorDesc(__in int nErrorID); // 返回错误ID
int GetErrorID(); // 连接MySQL数据库
bool Connect(__in string szIpAddr/*Ip地址*/, __in unsigned int unPort/*端口号*/,
__in string szUser/*用户名*/, __in string szPass/*密码*/, __in string szDatabase/*库名称*/); // 向数据库发送指令
bool Command(__in string szComm); // 接收结果
virtual bool Result(__out string **pOutBuf, __out int *pNum);
protected:
MYSQL *m_pMySQL;
int m_nErrorID;
}; #endif // C_MYSQL_H

// MySQL.cpp

// MySQL.cpp : 定义 DLL 应用程序的导出函数。
// #include "stdafx.h"
#include "MySQL.h" // 构造函数
CMySQL::CMySQL()
{
m_nErrorID = 0;
m_pMySQL = new MYSQL;
mysql_init(m_pMySQL); // 初始化MySQL结构
} // 析构函数
CMySQL::~CMySQL()
{
// 销毁MySQL结构
mysql_close(m_pMySQL);
delete m_pMySQL;
m_pMySQL = NULL;
} // 返回错误描述
string CMySQL::GetErrorDesc(__in int nErrorID)
{
switch (nErrorID)
{
case 0:
return "执行成功";
case -1:
return "参数错误";
case -2:
return "无数据";
default:
return mysql_error(m_pMySQL);
}
} // 返回错误ID
int CMySQL::GetErrorID()
{
int nTemp = m_nErrorID;
m_nErrorID = 0;
return nTemp;
} // 连接MySQL数据库
bool CMySQL::Connect(__in string szIpAddr, __in unsigned int unPort, __in string szUser, __in string szPass, __in string szDatabase)
{
if (szIpAddr.empty() || unPort <= 1024/*1024以下端口是操作系统预留端口,不可占用*/ || szUser.empty() || szPass.empty() || szDatabase.empty())
{
m_nErrorID = -1;
return false;
} // 连接MySQL服务器
if (!mysql_real_connect(m_pMySQL, szIpAddr.c_str(), szUser.c_str(), szPass.c_str(), szDatabase.c_str(), unPort, NULL, 0))
{
m_nErrorID = mysql_errno(m_pMySQL);
return false;
}
return true;
} // 向数据库发送指令
bool CMySQL::Command(__in string szComm)
{
if (szComm.empty()){
m_nErrorID = -1;
return false;
}
int nRet = mysql_real_query(m_pMySQL, szComm.c_str(), szComm.length());
if (nRet == 0)return true;
else {
m_nErrorID = nRet;
return false;
}
} // 接收结果
bool CMySQL::Result(__out string **pOutBuf, __out int *pNum)
{
if (!pOutBuf || !pNum)// 检查参数
{
m_nErrorID = -1;
return false;
}
MYSQL_RES *pRes = mysql_store_result(m_pMySQL);
if (!pRes) // 检查结果集
{
m_nErrorID = -2;
return false;
}
int nDataNumber = pRes->data->rows;// 有多少条(行)数据
if (nDataNumber < 1) // 检查有没有数据
{
m_nErrorID = -2;
return false;
}
string* pszRecvResult = new string[nDataNumber];
MYSQL_ROW row;
unsigned int nIndex = 0;
while (row = mysql_fetch_row(pRes))// 检索结果集
{
int nResultRowNumber = mysql_num_fields(pRes);// 获取结果集的行数
for (int i = 0; i < nResultRowNumber; i++)
{
pszRecvResult[nIndex] += row[i];
pszRecvResult[nIndex] += "\t";
}
nIndex++;
}
mysql_free_result(pRes); // 释放结果集
*pOutBuf = pszRecvResult;
*pNum = nDataNumber;
return true;
}

  (本人文化水平有限,写得不好还请不要介意!)

  

C++ MySQL编程的更多相关文章

  1. Visual C++ 2008进行MySQL编程

    visual c++ 2008进行MySQL编程(ODBC) -- (一) 套装安装 visual c++ 2008进行MySQL编程(ODBC) --(二) CDatabase操作数据库 visua ...

  2. MySQL编程基础

    本文是关于MySQL编程中的一些基础知识,包括变量和运算符.常用语句.函数. 一.变量与运算符 1.用户会话变量声明:SET @变量名 = 表达式;//即:用户会话变量无需提前定义,直接用赋值语句赋值 ...

  3. MySql——编程

    基本语法形式 语句块模式: 在mysql编程中,begin....end;基本代替了原来编程语句中的{...}语法. 但又有所区别: 一个bigin...end;块,可以给定一个“标识符”,并且可以使 ...

  4. mysql 编程初步

    mysql 编程 基本语法形式: 语句块模式 [begin_label] begin [statement_list] end [end_label]; label 标识符可以省略,但必须相同 流程控 ...

  5. visual c++ 2013进行MySQL编程(ODBC) -- (一) 套装安装

    最近写了有些技术类文章了,只因为最近研究多了些东西,有一些项目用到了,所以自己记录一下,怕自己忘记,如果有哪位同学有自己的见解,可以邮件或者回复,技术类的探讨,不管对否,都是欢迎的. 操作之前,必须安 ...

  6. MySQL编程

    MySQL 使用标准 SQL 检索和处理数据,体积小.开源.免费,易于快速部署.正是因为这些特点,使得其在互联网行业,特别是 Web 应用方面使用相当广泛.至今最新的版本已到 8.0. 一 基本操作 ...

  7. python入门编程之mysql编程

    python关于mysql方面的连接编程 前提:引入mysql模块MySQLdb,即:MySQL_python-1.2.5-cp27-none-win_amd64.whl 如果要用线程池,则要引用模块 ...

  8. JAVA / MySql 编程——第八章 DAO 模式

    1.        数据持久化:将程序中的数据在瞬时状态和持久状态间转换的机制即为数据持久化: 2.        持久化的实现方式:数据库.普通文件.XML文件: 3.        JDBC封装: ...

  9. JAVA / MySql 编程——第七章 JDBC

    1.JDBC:JDBA是Java数据库连接(Java DataBase Connectivity)技术的简称,提供连接各种常用数据库的能力:         ●Java是通过JDBC技术实现对各种数据 ...

随机推荐

  1. Jenkins去GitLab拉取Java代码自动打包

    jenkins的部署 一.部署git 1)先检查系统是否已经自带了git,如果有,就卸载 $ rpm -qa | grep git && rpm -e git --nodeps 2)开 ...

  2. Java中的各种bean对应的意义(VO,PO,BO,QO, DAO,POJO,DTO)

    VO(value object) 值对象 通常用于业务层之间的数据传递,用 new 关键字创建,由 GC 回收的,和 PO 一样也是仅仅包含数据而已.但应是抽象出的业务对象 , 可以和表对应 , 也可 ...

  3. linux配置虚拟机的网络服务

    一.找到网卡位置 二.配置协议 删除网卡物理地址+UUID(方便后期克隆虚拟机,不至于多个虚拟机之间有相同的网卡物理地址,防止出现网络问题)`` cd /etc/sysconfig/network-s ...

  4. oracle 存储过程循环打开游标数据处理

    2017-07-24 14:12:42 SQL内容: 1.一次性检索 100000 条数据. 2. 1000 条提交一次. 3.超过 100000 万条,重新打开游标,重新检索. pl/sql内容如下 ...

  5. conda命令简单使用

    Anaconda是一种Python语言的免费增值开源发行版,用于进行大规模数据处理.预测分析,和科学计算,致力于简化包的管理和部署.Anaconda使用软件包管理系统Conda进行包管理. 1.查看系 ...

  6. 第 9 章 数据管理 - 076 - 使用 Rex-Ray volume

    使用 Rex-Ray volume 在 docker1 或 docker2 上执行如下命令创建 volume: rexray volume create --size 2 'C:\share\myda ...

  7. Redis缓存之自定义CacheManager

    测试缓存:原理:CacheManager===Cache 缓存组件来实际给缓存中存储数据1,引入redis的starter,容器中保存的是RedisCacheManager2,RedisCacheMa ...

  8. Facebook主页照片和封面照片的尺寸要求

    为什么好好的照片上传到Facebook后效果总不理想?为了避免你的照片在上传时被压缩,建议你尽量调整一下图片大小和格式,下面一起来看看Facebook主页照片和封面照片的尺寸要求. 1. Facebo ...

  9. 一个简单的C语言程序(详解)

    C Primer Plus之一个简单的C语言程序(详解) #include <stdio.h> int main(void) //一个简单的 C程序 { int num; //定义一个名为 ...

  10. vue中的keep-alive

    本文转载于:https://blog.csdn.net/xum222222/article/details/80322532 转载仅供个人日后学习 https://www.cnblogs.com/ji ...