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技术实现对各种数据 ...
随机推荐
- IOS runtime运行机制详解(一)
OC运行机制是指,可以运行的时候动态调用函数.因为C语言必须在编译的时候就决定调用哪个函数. 我们平时写的OC代码,它在运行的时候也是转换成了runtime的方式运行的.任何方法调用本质:就是发送一个 ...
- 【GO】【LiteIDE】
https://blog.csdn.net/qq_32034593/article/details/82986311 下载地址:https://www.golangtc.com/download/li ...
- SAM宏观生态学空间分析帮助文档
宏观生态学分析软件帮助文档: 引言: 该软件是由布鲁塞尔..大学开发,目的是提供一个综合的空间分析计算平台,主要针对的是宏观生态学数据.该软件可以从网站...上自由获取,该软件的主要特征以及发表在20 ...
- DAY 23 面向对象(二)
一.对象独有的名称空间 在产生对象时就赋初值 class Student: def __init__(self,name,sex): self.name = name self.sex = sex # ...
- 如何系统地自学 Python?
最近开始系统的学习Python,以及整理的一些资料.github记录着个人自学 Python 的过程,持续更新.欢迎大家一起来完善这个自学Python学习的项目,给后来者一个参考的学习过程.githu ...
- English trip V2 - 6 Sports Teacher:Taylor Key:phrasal verbs
In this lesson you will learn to talk about sports. 课上内容(Lesson) # How many different sports can you ...
- pip安装软件或模块时提示cannot import name 'main'
旧的pip文件内容如下: from pip import main if __name__ == '__main__': sys.exit(main()) 修改后的文件内容: from pip imp ...
- 安装在类虚拟机crossover中的容器怎么进行的备份和恢复
备份教程: 步骤一:运行CrossOver,选中相关容器,然后在[容器]中找到并点击[导出“MathType6.9b_Trial_YY.exe”到存档],或者直接右击容器名称,然后选择[导出“Math ...
- 课堂小练习(complex类)
定义一个复数类Complex,使得下面的代码能够工作: Complex c1(3,5); //用复数3+5i初始化c1: Compex c2=4.5; //用实数4.5初始化c2 c ...
- python基本概念
python环境以及python的搭建的基本知识 python解释器 python语言的本质 通过解释器将脚本翻译成机器能识别的二进制码,交予机器执行 pycharm ide:集成开发环境 集成编译器 ...