C++操作MYSQL数据库类

头文件

#pragma once
#include "include_db/mysql.h"
#include "ReadExcelClass.h"
#include <locale.h>
#include <vector>

#define LOADDATANUM 100 //一次加载条数
#define MIN_TABINFO 1 //字段个数
static CString g_TABLEHEADINFO = L"id";

static CString g_CREATTABINFO = L"id varchar(255)";
class CDataBaseClass
{
public:
	CDataBaseClass(void);
	virtual ~CDataBaseClass(void);
public:
	MYSQL m_mysql;
	MYSQL_RES *m_res;
	MYSQL_ROW m_row;
	LPCSTR m_lpstrIP;
	LPCSTR m_lpstrUser;
	LPCSTR m_lppassWorld;
	LPCSTR m_lpstrdataBaseName;
	int m_port;
public:
	//创建数据库
	BOOL CreatDataBase(CString dbname);
	//连接数据库
	BOOL ConnectDataBase(MYSQL &my_sql, CString strIP, CString strUser, CString password, CString strdataBaseName, int port);
	//数据库操作
	BOOL QueryDataBase(MYSQL &my_sql, CString strSelect);
	//数据插入更新操作
	BOOL AffectedRowDataBase(MYSQL &my_sql, CString strSelect);
	//建表
	BOOL CreateTables(MYSQL &my_sql, CString strtables, CString tablesinfo);
	//断开数据库
	BOOL CloseDataBase(MYSQL &my_sql);
	//检测数据库是否存活
	BOOL PingDataBase(MYSQL &my_sql);
	//重启mysql
	BOOL ReStartDataBase(MYSQL &my_sql);
	//Excel数据导入数据库
	BOOL LoadExcelToDB(MYSQL &my_sql, CString tablename, CString strPath, int iRow, int iCol);
	//txt数据导入数据库
	void ReadTxtData(CString strPath, CStringList &strList);
	BOOL LoadTxtToDB(MYSQL &my_sql, CString tablename, CString strtabinfo, CString strPath);
	int SplitString(const CString str, char split, std::vector<CString> &strList);  
	//数据库导出txt
	BOOL OutPutTxtFile(MYSQL &my_sql, CString dbTableName, CString outpath);
	//数据库导出excel
	BOOL OutPutExcelFile(MYSQL &my_sql, CString dbTableName, CString outpath);
	//删除数据表
	BOOL DeleteTables(MYSQL &my_sql, CString tablesName);
};

cpp实现文件

#include "StdAfx.h"
#include "DataBaseClass.h"

CDataBaseClass::CDataBaseClass(void)
{
	m_res = NULL;
}


CDataBaseClass::~CDataBaseClass(void)
{
	m_res = NULL;
}

BOOL CDataBaseClass::CreatDataBase(CString dbname)
{
	if (dbname.IsEmpty())
	{
		return FALSE;
	}

	USES_CONVERSION;
	LPCSTR lpstr = (LPCSTR)T2A(dbname);
	char buf[1024];
	sprintf_s(buf, "create database if not exists %s", lpstr);

	if(0 == mysql_query(&m_mysql, buf))
	{
		return TRUE;
	}
	
	return FALSE;
}

BOOL CDataBaseClass::ConnectDataBase(MYSQL &my_sql, CString strIP, CString strUser, CString password, CString strdataBaseName, int port)
{
	mysql_init(&my_sql);
	USES_CONVERSION;
	m_lpstrIP = (LPCSTR)T2A(strIP);
	m_lpstrUser = (LPCSTR)T2A(strUser);
	m_lppassWorld = (LPCSTR)T2A(password);
	m_lpstrdataBaseName = (LPCSTR)T2A(strdataBaseName);
	m_port = port;

	if (!mysql_real_connect(&my_sql, m_lpstrIP, m_lpstrUser, m_lppassWorld, m_lpstrdataBaseName, m_port,NULL,0))
	{
		return FALSE;
	}

	if (mysql_ping(&my_sql) != 0)
	{
		return FALSE;
	}

	mysql_query(&my_sql, "SET NAMES 'GB2312'");
	m_mysql = my_sql;

	return TRUE;
}

BOOL CDataBaseClass::QueryDataBase(MYSQL &my_sql, CString strSelect)
{
	if (strSelect.IsEmpty())
	{
		return FALSE;
	}

	USES_CONVERSION;
	LPCSTR lpstr = (LPCSTR)T2A(strSelect);

	mysql_query(&my_sql, "START TRANSACTION");
	if (mysql_query(&my_sql, lpstr) == 0)
	{
		m_res = mysql_store_result(&my_sql);
		if (m_res->row_count <= 0)
		{
			return FALSE;
		}
	}
	else
	{
		return FALSE;
	}
	mysql_query(&my_sql, "COMMIT");
	return TRUE;
}

BOOL CDataBaseClass::AffectedRowDataBase(MYSQL &my_sql, CString strSelect)
{
	if (strSelect.IsEmpty())
	{
		return FALSE;
	}

	USES_CONVERSION;
	LPCSTR lpstr = (LPCSTR)T2A(strSelect);
	std::vector<CString> strlist;
	SplitString(strSelect, ',', strlist);
	mysql_query(&my_sql, "START TRANSACTION");
	if (mysql_query(&my_sql, lpstr) == 0)
	{
		if (mysql_affected_rows(&my_sql) <= 0)
		{
			return FALSE;
		}
	}
	else
	{
		return FALSE;
	}
	mysql_query(&my_sql, "COMMIT");
	return TRUE;
}

BOOL CDataBaseClass::CreateTables(MYSQL &my_sql, CString strtables, CString tablesinfo)
{
	USES_CONVERSION;
	LPCSTR lpstr = (LPCSTR)T2A(strtables);
	LPCSTR lpstrtab = (LPCSTR)T2A(g_CREATTABINFO);
	char buf[3096];
	sprintf_s(buf, "create table if not exists %s(%s)", lpstr, lpstrtab);

	if (0 == mysql_query(&my_sql, buf))
	{
		return TRUE;
	}
	
	return FALSE;
}

BOOL CDataBaseClass::CloseDataBase(MYSQL &my_sql)
{
	mysql_close(&my_sql);

	return TRUE;
}

BOOL CDataBaseClass::PingDataBase(MYSQL &my_sql)
{
	//不存活
	if (mysql_ping(&m_mysql) != 0)
	{
		return FALSE;
	}

	return TRUE;
}

BOOL CDataBaseClass::ReStartDataBase(MYSQL &my_sql)
{
	CloseDataBase(my_sql);
	if (!mysql_real_connect(&m_mysql, m_lpstrIP, m_lpstrUser, NULL, m_lpstrdataBaseName, m_port,NULL,0))
	{
		return FALSE;
	}

	return TRUE;
}

BOOL CDataBaseClass::LoadExcelToDB(MYSQL &my_sql, CString tablename, CString strPath, int iRow, int iCol)
{
	HRESULT hr;
	hr = CoInitialize(NULL);
	if (FAILED(hr))
	{
		return FALSE;
	}

	CApplication ExcelApp;
	COleVariant covOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);
	if (!ExcelApp.CreateDispatch(L"Excel.Application"))
	{
		return FALSE;
	}
	CWorkbooks books;
	CWorkbook book;
	CWorksheets sheets;
	CWorksheet sheet;
	CRange range;
	CRange iCell;
	LPDISPATCH lp;

	books.AttachDispatch(ExcelApp.get_Workbooks());
	lp = books.Open(strPath, covOptional,covOptional,covOptional,covOptional,
		covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,
		covOptional,covOptional,covOptional,covOptional);

	book.AttachDispatch(lp);

	sheets.AttachDispatch(book.get_Worksheets());
	lp = book.get_ActiveSheet();
	sheet.AttachDispatch(lp);

	range.AttachDispatch(sheet.get_Cells());
	CString *pstr = new CString[iCol];
	for (int i = 0; i < iRow; i++)
	{
		for (int j = 0; j < iCol; j++)
		{
			COleVariant rValue;
			CRange rag;
			rag.AttachDispatch(range.get_Item(COleVariant((long)i+2),COleVariant((long)j+1)).pdispVal, TRUE);

			rValue = rag.get_Value2();

			if (rValue.vt == VT_BSTR)
			{
				pstr[j] = rValue.bstrVal;
			}
			else if (rValue.vt == VT_INT)
			{
				pstr[j].Format(_T("%d"), rValue.dblVal);
			}
			else if (rValue.vt == VT_R8)
			{
				pstr[j].Format(_T("%0.2f"), rValue.dblVal);
			}
			else if (rValue.vt == VT_EMPTY)
			{
				pstr[j] = "";
			}
			else if (rValue.vt == VT_DATE)
			{
				SYSTEMTIME st;
				VariantTimeToSystemTime(rValue.date, &st);
				CTime tm(st);
				pstr[j] = tm.Format("%Y/%m/%d");
			}		
		}
		
		CString info;
		for (int i = 0; i < iCol; i++)
		{
			if (i < iCol - 1)
			{
				info += "'";
				info += pstr[i];
				info += "'";
				info += ",";
			}
			else
			{
				info += "'";
				info += pstr[i];
				info += "'";
			}
		}
		CString str;
		str.Format(_T("insert into %s(%s) values(%s)"),tablename, g_TABLEHEADINFO, info);
		if (AffectedRowDataBase(my_sql, str) == FALSE)
		{
			if (pstr != NULL)
			{
				delete []pstr;
			}
			return FALSE;
		}
	}

	if (pstr != NULL)
	{
		delete []pstr;
	}
	books.Close();
	ExcelApp.Quit();

	range.ReleaseDispatch();
	sheet.ReleaseDispatch();
	sheets.ReleaseDispatch();
	book.ReleaseDispatch();
	books.ReleaseDispatch();

	return TRUE;
}

void CDataBaseClass::ReadTxtData(CString strPath, CStringList &strList)
{
	CStdioFile file;
	CString strdata;
	ULONGLONG pos = 0;
	char *old_locale=_strdup(setlocale(LC_CTYPE, NULL));
	setlocale(LC_CTYPE, "chs");
	if (file.Open(strPath, CFile::modeRead|CFile::typeText))
	{
		file.Seek(pos,CFile::begin);

		while(TRUE)
		{
			
			if (file.ReadString(strdata) != FALSE)
			{
				pos = file.GetPosition();
				CString str = strdata;	
				strList.AddTail(strdata);
			}
			else
			{
				break;
			}
		}
		
	}
	setlocale(LC_CTYPE, old_locale);
	free(old_locale);
	file.Close();

	return;
}

BOOL CDataBaseClass::LoadTxtToDB(MYSQL &my_sql, CString tablename, CString strtabinfo,CString strPath)
{
	if (strPath.IsEmpty())
	{
		return FALSE;
	}
	CStringList strList;
	ReadTxtData(strPath, strList);
	std::vector<CString> infoList;

	int pos = strPath.ReverseFind('\\');
	CString strpathfile = strPath.Mid(0, pos+1);
	strpathfile.Replace('\\', '/');
	if (LOADDATANUM >= strList.GetSize()-1)
	{
		for (int i = 1; i < strList.GetSize(); i++)
		{
			POSITION pos;
			pos = strList.FindIndex(i);
			CString str = strList.GetAt(pos);
			std::vector<CString> vec;
			int ret = SplitString(str, '	', vec);
			if (ret < MIN_TABINFO)
			{
				return FALSE;
			}

			CString info;	
			for (unsigned int j = 0; j < vec.size(); j++)
			{
				if (j < vec.size() - 1)
				{
					info += "'";
					info += vec[j];
					info += "'";
					info += ",";
				}
				else
				{
					info += "'";
					info += vec[j];
					info += "'";
				}
			}

			infoList.push_back(info);		
		}

		CString infosel;
		for (unsigned int k = 0; k < infoList.size(); k++)
		{
			if (k < infoList.size()-1)
			{
				infosel += L"(";
				infosel += infoList[k];
				infosel += L")";
				infosel += ",";
			}
			else
			{
				infosel += L"(";
				infosel += infoList[k];
				infosel += L")";
			}

		}

		CString strsql;
		strsql.Format(_T("insert into %s(%s) values %s"), tablename, g_TABLEHEADINFO, infosel);
		if (AffectedRowDataBase(my_sql, strsql) == FALSE)
		{
			return FALSE;
		}

		infoList.clear();
	}
	else
	{
		int icount = (strList.GetSize()-1) / LOADDATANUM;
		int surplus = (strList.GetSize()-1) - (LOADDATANUM * icount);
		int hadreadnum = 0;
		int iLoop = 0;
		int loop = 0;
		for (int i = 1; i < strList.GetSize(); i++)
		{
			POSITION pos;
			pos = strList.FindIndex(i);
			CString str = strList.GetAt(pos);
			std::vector<CString> vec;
			int ret = SplitString(str, '	', vec);
			if (ret < MIN_TABINFO)
			{
				return FALSE;
			}
			CString info;	
			for (unsigned int j = 0; j < vec.size(); j++)
			{
				if (j < vec.size() - 1)
				{
					info += "'";
					info += vec[j];
					info += "'";
					info += ",";
				}
				else
				{
					info += "'";
					info += vec[j];
					info += "'";
				}
			}

			infoList.push_back(info);
			CString infosel;
			if (/*(hadreadnum + surplus == icount*LOADDATANUM) && */iLoop == icount && i == strList.GetSize()-1)
			{

				for (unsigned int k = 0; k < infoList.size(); k++)
				{
					if (k < infoList.size()-1)
					{
						infosel += L"(";
						infosel += infoList[k];
						infosel += L")";
						infosel += ",";
					}
					else
					{
						infosel += L"(";
						infosel += infoList[k];
						infosel += L")";
					}

				}
				CString strsql;
				strsql.Format(_T("insert into %s(%s) values %s"), tablename, strtabinfo, infosel);
				if (AffectedRowDataBase(my_sql, strsql) == FALSE)
				{
					return FALSE;
				}
				infoList.clear();
			}
			else
			{
				if (i % LOADDATANUM == 0 && i != 0)
				{
					iLoop++;
					hadreadnum += (iLoop * LOADDATANUM);
					for (unsigned int k = 0; k < infoList.size(); k++)
					{
						if (k < infoList.size()-1)
						{
							infosel += L"(";
							infosel += infoList[k];
							infosel += L")";
							infosel += ",";
						}
						else
						{
							infosel += L"(";
							infosel += infoList[k];
							infosel += L")";
						}

					}
					CString strsql;
					strsql.Format(_T("insert into %s(%s) values %s"), tablename, strtabinfo, infosel);
					if (AffectedRowDataBase(my_sql, strsql) == FALSE)
					{
						return FALSE;
					}

					infoList.clear();
				}
			}
		}
	}

	return TRUE;
}

int CDataBaseClass::SplitString(const CString str, char split, std::vector<CString> &strList)  
{  
	strList.clear();  
	CString strTemp = str;  
	int iIndex = 0;  
	while (1)  
	{  
		iIndex = strTemp.Find(split);  
		if(iIndex >= 0)  
		{  
			strList.push_back(strTemp.Left(iIndex));  
			strTemp = strTemp.Right(strTemp.GetLength()-iIndex-1);  
		}  
		else  
		{  
			break;  
		}  
	}  

	if (!strTemp.IsEmpty())
	{
		strList.push_back(strTemp);
	}
	  
	return strList.size();  
}

BOOL CDataBaseClass::OutPutTxtFile(MYSQL &my_sql, CString dbTableName, CString outpath)
{
	if(dbTableName.IsEmpty())
	{
		return FALSE;
	}
	
	char * loa = _strdup(setlocale(LC_CTYPE,NULL));
	setlocale(LC_CTYPE,"chs");
	CStdioFile myfile;
	if (!myfile.Open(outpath, CFile::modeCreate | CFile::modeReadWrite))
	{
		AfxMessageBox(L"Error");
		return FALSE;
	}

	CString gettabHead = L"SHOW COLUMNS FROM ";
	gettabHead += dbTableName;
	QueryDataBase(my_sql, gettabHead);
	CString headinfo;
	while(m_row = mysql_fetch_row(m_res))
	{
		
		for (unsigned int i = 0; i < 1; i++)
		{
			headinfo += m_row[i];
			headinfo += ",";
		}
	}
	CString strhead;
	//WriteTxtHead(headinfo, strhead);
	myfile.WriteString(strhead + '\n');

	CString strCommond = L"select * from ";
	strCommond += dbTableName;
	QueryDataBase(my_sql, strCommond);

	while(m_row = mysql_fetch_row(m_res))
	{ 
		CString str;
		for (unsigned int i = 0; i < m_res->field_count; i++)
		{
			if (i < m_res->field_count - 1)
			{
				str += m_row[i];
				str += "	";
			}
			else
			{
				str += m_row[i];
			}
		}
		myfile.WriteString(str + '\n');	

	}
	myfile.Close();	
	setlocale(LC_CTYPE,loa);
	free(loa);

	return TRUE;
}

BOOL CDataBaseClass::OutPutExcelFile(MYSQL &my_sql, CString dbTableName, CString outpath)
{
	if(dbTableName.IsEmpty())
	{
		return FALSE;
	}
	
	HRESULT hr;
	hr = CoInitialize(NULL);
	if (FAILED(hr))
	{
		return FALSE;
	}

	CApplication ExcelApp;
	COleVariant covOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);
	if (!ExcelApp.CreateDispatch(L"Excel.Application"))
	{
		return FALSE;
	}
	CWorkbooks books;
	CWorkbook book;
	CWorksheets sheets;
	CWorksheet sheet;
	CRange range;
	CRange iCell;

	books = ExcelApp.get_Workbooks();
	book = books.Add(covOptional);
	sheets = book.get_Worksheets();
	sheet = sheets.get_Item(COleVariant((short)1));

	range = sheet.get_Range(COleVariant(L"A1"),COleVariant(L"B6"));
	range = sheet.get_Cells();
	iCell = range.get_EntireColumn();
	iCell.AutoFit();

	CString gettabHead = L"SHOW COLUMNS FROM ";
	gettabHead += dbTableName;
	QueryDataBase(my_sql, gettabHead);
	CString headinfo;
	while(m_row = mysql_fetch_row(m_res))
	{

		for (unsigned int i = 0; i < 1; i++)
		{
			headinfo += m_row[i];
			headinfo += ",";
		}
	}

	CString strCommond = L"select * from ";
	strCommond += dbTableName;
	QueryDataBase(my_sql, strCommond);
	long iRow = 1;
	long iColumn = 1;
	//WriteExcelHead(headinfo, range, iRow, iColumn);
	while(m_row = mysql_fetch_row(m_res))
	{ 
		iColumn = 1;
		for (unsigned int i = 0; i < m_res->field_count; i++)
		{
			CString str(m_row[i]);
			range.put_Item(COleVariant((long)iRow),COleVariant((long)iColumn),COleVariant(str));
			++iColumn;	
		}
		iRow++;
	}

	iCell = range.get_EntireColumn();
	iCell.AutoFit();
	book.SaveCopyAs(COleVariant(outpath));
	book.put_Saved(TRUE);

	books.Close();
	ExcelApp.Quit();

	range.ReleaseDispatch();
	sheet.ReleaseDispatch();
	sheets.ReleaseDispatch();
	book.ReleaseDispatch();
	books.ReleaseDispatch();

	return TRUE;
}

BOOL CDataBaseClass::DeleteTables(MYSQL &my_sql, CString tablesName)
{
	if (tablesName.IsEmpty())
	{
		return FALSE;
	}

	USES_CONVERSION;
	LPCSTR lpstr = (LPCSTR)T2A(tablesName);
	char buf[1024];
	sprintf_s(buf, "drop table %s", lpstr);

	mysql_query(&my_sql, "START TRANSACTION");
	if (mysql_query(&my_sql, buf) != 0)
	{
		return FALSE;
	}
	mysql_query(&my_sql, "COMMIT");

	return TRUE;
}

操作ReadExcelClass.h在下节介绍

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值