C++ MySQL编程

摘要:
MySQL编程需要包含<MySQL>。h˃ 头文件。该文件通常位于MySQL安装目录下的include文件夹中。MySQL编程与Socket编程非常相似。唯一的区别是MySQL使用MySQL结构,而Socket使用Socket。有关功能的详细信息,请参阅MYSQL参考手册下载地址:链接:https://pan.baidu.com/s/1qZ96XtU密码:zk5l/MySQL。h#ifndefC_ MYSQL_ h//防止#defineC多次包含_ MYSQL_ h//导出/导入函数#ifdefMYSQL_ EXPORTS#defineMYSQLAPI__declspec#else#defineMYSQLAPI__declspec#endif//头文件#include“stdafx.h”#include<WinSock2。h˃ #include“X:ProgramFiles MySQL MySQLServer5.5 include MySQL.h”#include<string>usingstd::string#Pragmacomment//链接动态库#pragmawarning//屏蔽编译警告#pragmawarning#pragmawarning classMYSQLAPICMySQL{public:CMSQL();virtual~CMySQL();public://Return错误描述字符串GetErrorDesc//返回错误IDintGetErrorID()//连接MySQL数据库boolConnect//向数据库发送指令boolCommand//接收结果virtualpoolResult;受保护:MYSQL*m_pMySQL;intm_nErrorID;}#endif//C_MYSQL_H//MYSQL。cpp//MySQL。cpp:定义DLL应用程序的导出函数。

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] += "	";
		}
		nIndex++;
	}
	mysql_free_result(pRes);	// 释放结果集
	*pOutBuf = pszRecvResult;
	*pNum = nDataNumber;
	return true;
}

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

  

免责声明:文章转载自《C++ MySQL编程》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇四 数据模型操作NetBus —— 让你的 App 内部随处感知网络的变化下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

MySQL查询性能优化

1.为什么查询速度为变慢 在尝试编写快速的查询之前,需要清楚一点,真正重要是响应时间。如果把查询看作是一个任务,那么他由一系列子任务组成,每个子任务都会消耗一定的时间。如果要优化查询,实际上要优化其子任务,要么消除其中一些子任务,要么减少子任务的执行的次数,要么让子任务运行得更快。 MySQL在执行查询的时候有哪些子任务。哪些子任务运行的速度很慢,这里很难...

mysql索引无效且sending data耗时巨大原因分析

一朋友最近新上线一个项目,本地测试环境跑得好好的,部署到线上却慢得像蜗牛一样。后来查询了一下发现一个sql执行了16秒,有些长的甚至80秒。本地运行都是毫秒级别的查询。下面记录一下困扰了两天的,其中一条sql的优化。 表结构及现象描述: CREATE TABLE`wp_goods` ( `id` bigint(20) unsigned NOT NUL...

mysql快速保存插入大量数据一些方法总结(转)

本文转自:mysql快速保存插入大量数据一些方法总结 说明: 这几天尝试了使用不同的存储引擎大量插入MySQL表数据,主要试验了MyISAM存储引擎和InnoDB。下面是实验过程: 实现:一、InnoDB存储引擎。创建数据库和表  代码如下 1 > CREATE DATABASE ecommerce; > CREATE TABLE e...

php并发控制 , 乐观锁

由于悲观锁在开始读取时即开始锁定,因此在并发访问较大的情况下性能会变差。对MySQL Inodb来说,通过指定明确主键方式查找数据会单行锁定,而查询范围操作或者非主键操作将会锁表。 接下来,我们看一下如何使用乐观锁解决这个问题。 MYSQL 首先我们为counter表增加一列update_time字段,当进行操作时,将先前读取的update_time与当时...

Linux下修改MySQL数据库字符编码为UTF-8解决中文乱码

由于MySQL编码原因会导致数据库出现乱码。 解决办法: 修改MySQL数据库字符编码为UTF-8,UTF-8包含全世界所有国家需要用到的字符,是国际编码。 具体操作: 1、进入MySQL控制台 >mysql -uroot -p #输入密码进入 >status; #查看当前MySQL运行状态,如下图所示:  ...

docker安装启动、配置MySql

1、安装mysql镜像 docker pull mysql/mysql-server 2、docker中启动Mysql容器 docker run --name mysql01 -d -p 3306:3306 mysql/mysql-server 启动后执行: docker ps 通过以下命令查看root的password docker logs...