C++ MySQL编程
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编程的更多相关文章
- Visual C++ 2008进行MySQL编程
visual c++ 2008进行MySQL编程(ODBC) -- (一) 套装安装 visual c++ 2008进行MySQL编程(ODBC) --(二) CDatabase操作数据库 visua ...
- MySQL编程基础
本文是关于MySQL编程中的一些基础知识,包括变量和运算符.常用语句.函数. 一.变量与运算符 1.用户会话变量声明:SET @变量名 = 表达式;//即:用户会话变量无需提前定义,直接用赋值语句赋值 ...
- MySql——编程
基本语法形式 语句块模式: 在mysql编程中,begin....end;基本代替了原来编程语句中的{...}语法. 但又有所区别: 一个bigin...end;块,可以给定一个“标识符”,并且可以使 ...
- mysql 编程初步
mysql 编程 基本语法形式: 语句块模式 [begin_label] begin [statement_list] end [end_label]; label 标识符可以省略,但必须相同 流程控 ...
- visual c++ 2013进行MySQL编程(ODBC) -- (一) 套装安装
最近写了有些技术类文章了,只因为最近研究多了些东西,有一些项目用到了,所以自己记录一下,怕自己忘记,如果有哪位同学有自己的见解,可以邮件或者回复,技术类的探讨,不管对否,都是欢迎的. 操作之前,必须安 ...
- MySQL编程
MySQL 使用标准 SQL 检索和处理数据,体积小.开源.免费,易于快速部署.正是因为这些特点,使得其在互联网行业,特别是 Web 应用方面使用相当广泛.至今最新的版本已到 8.0. 一 基本操作 ...
- python入门编程之mysql编程
python关于mysql方面的连接编程 前提:引入mysql模块MySQLdb,即:MySQL_python-1.2.5-cp27-none-win_amd64.whl 如果要用线程池,则要引用模块 ...
- JAVA / MySql 编程——第八章 DAO 模式
1. 数据持久化:将程序中的数据在瞬时状态和持久状态间转换的机制即为数据持久化: 2. 持久化的实现方式:数据库.普通文件.XML文件: 3. JDBC封装: ...
- JAVA / MySql 编程——第七章 JDBC
1.JDBC:JDBA是Java数据库连接(Java DataBase Connectivity)技术的简称,提供连接各种常用数据库的能力: ●Java是通过JDBC技术实现对各种数据 ...
随机推荐
- 解决 EDAS:Upload failed: The right margin is 0.535 in on page 1 问题
参考: IEEETran page margins 解决 EDAS:Upload failed: The right margin is 0.535 in on page 1 问题 在 EDAS 上上 ...
- webpack dllPlugin使用(基于vue-cli webpack模板)
由于本例单入口时打包的文件体积过大,将其分成多入口. 主要涉及到的几个文件为: /index.html, /webpack.dll.config.js, /build/webpack.base.con ...
- Economics degrees
Economics degrees Name game"> 经济学学位"> 名称痕戏 Luring students with a new label 新瓶旧酒吸引学生 ...
- 改变选择文字的color及background-color
在一些特殊的网站中,常常会有着一些新奇的体验,在阅读网页的时候相信许多人都会和我一样有着一个习惯,把一些文字选中然后进行阅读,或者时要复制粘贴的时候选择文字对吧.然而无论是在ie,chrome,fir ...
- python 数据分类赋值
问题描述:在数据预处理时,往往需要对描述性数据进行分类赋值或对数据进行分级赋值. 首先,会想到用for循环,依次判断赋值: for n in range(len(data1)): print(n) i ...
- android -------- Hawk数据库
Hawk 是一个非常便捷的数据库 . 操作数据库只需一行代码 , 能存任何数据类型 . github 地址: https://github.com/orhanobut/hawk 一.概念 Share ...
- python 爬虫新解
关于python爬虫多个库的选择反反复复,总是不知道选择哪个,通过试过多个晚上的选择 reques Beautifulsoup 以上两个库足够爬虫,已反爬虫网站数据的爬取.先上代码: 库的调用: 网页 ...
- 生成SQL Server数据字典
1.表信息 Select * FROM INFORMATION_SCHEMA.COLUMNS order by Table_name; select * from INFORMATION_SCHEMA ...
- Asp.Net Core基于JWT认证的数据接口网关Demo
近日,应一位朋友的邀请写了个Asp.Net Core基于JWT认证的数据接口网关Demo.朋友自己开了个公司,接到的一个升级项目,客户要求用Aps.Net Core做数据网关服务且基于JWT认证实现对 ...
- BZOJ2662 [BeiJing wc2012]冻结
网上的题解都是分层图+spfa或者dijkstra 我觉得dijk太难写了,懒得写,看了一下数据范围$N=50$,这显然是出题人勾引人犯罪 我决定使用floyd的做法,令$f[i][j][t](k)$ ...