头文件
#pragma once
#include "include_db/mysql.h"
#include "ReadExcelClass.h"
#include
#include
#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在下节介绍