C++ MySQL编程

时间:2023-03-09 14:59:25
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;
}

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