近三个小时查阅、编码、测试,完成了一小部分内容,拿来分享下吧(因为开发使用MFC(unicode),所以数据类型大多贴近项目),希望有熟识相关操作的前辈给予指点,现学现卖。。好多api还没细看。
代码先放上来,没有严格测试,如有问题,也请指正。
MySqlDbConn.h
#pragma once
#include "mysql.h"
#include <vector>
#include <map>
using namespace std;
class CMySqlDbConn
{
public:
CMySqlDbConn(void);
~CMySqlDbConn(void);
// Parameter: LPWSTR lpConn 数据库连接字符串 用户名/密码/数据库名
BOOL dbOpen(LPWSTR lpConn,LPWSTR lpAddr = _T("localhost"));
// Method: 执行INSERT\UPDATE\DELETE sql语句
BOOL ExecuteSql(const CString strSql);
// Method: 执行SELECT sql语句
BOOL ExecuteQuerySql(const CString strSql);
CString GetField(const CString strField);
CString GetField(int nField);
void MoveNext();
BOOL IsEOF();
void dbClose();
private:
MYSQL *m_sqlConn;
MYSQL_RES *m_result;
MYSQL_ROW m_row;
map<CString,int> m_mapField;
vector<CString> SplitString(CString strString,char cr);
};
MySqlDbConn.cpp
#include "StdAfx.h"
#include "MySqlDbConn.h"
CMySqlDbConn::CMySqlDbConn(void)
{
m_sqlConn = new MYSQL;
}
CMySqlDbConn::~CMySqlDbConn(void)
{
}
BOOL CMySqlDbConn::dbOpen(LPWSTR lpConn,LPWSTR lpAddr)
{
try
{
vector<CString> strVec = SplitString(lpConn,'/');
if (strVec.size() < 3)
{
return FALSE;
}
mysql_init(m_sqlConn);
if(!mysql_real_connect(m_sqlConn, _bstr_t(lpAddr),_bstr_t(strVec.at(0)),_bstr_t(strVec.at(1)),_bstr_t(strVec.at(2)),3306,NULL,0))
{
return FALSE;
}
}
catch (CException* e)
{
LPWSTR lpError = NULL;
AfxMessageBox(e->GetErrorMessage(lpError,NULL));
return FALSE;
}
return TRUE;
}
BOOL CMySqlDbConn::ExecuteSql(const CString strSql)
{
if(mysql_real_query(m_sqlConn,_bstr_t(strSql),(UINT)strlen(_bstr_t(strSql))) != 0)
{
return FALSE;
}
return TRUE;
}
BOOL CMySqlDbConn::ExecuteQuerySql(const CString strSql)
{
if (!ExecuteSql(strSql))
{
return FALSE;
}
m_result = mysql_use_result(m_sqlConn);
m_row = mysql_fetch_row(m_result);
MYSQL_FIELD *fields;
fields = mysql_fetch_fields(m_result);
unsigned int num = mysql_num_fields(m_result);
for (unsigned int i = 0; i < num; i ++)
{
CString strFields(fields[i].name);
m_mapField[ExtractionName(strFields)] = i;
}
return TRUE;
}
CString CMySqlDbConn::GetField(const CString strField)
{
CString strUpper = strField;
return GetField(m_mapField[strUpper.MakeUpper()]);
}
CString CMySqlDbConn::GetField(int nField)
{
mysql_field_seek(m_result,nField);
CString strField(m_row[nField]);
return strField;
}
void CMySqlDbConn::MoveNext()
{
m_row = mysql_fetch_row(m_result);
}
BOOL CMySqlDbConn::IsEOF()
{
if (mysql_eof(m_result))
{
mysql_free_result(m_result);
return FALSE;
}
return TRUE;
}
void CMySqlDbConn::dbClose()
{
mysql_close(m_sqlConn);
}
vector<CString> CMySqlDbConn::SplitString(CString strString,char cr)
{
vector<CString> strVec;
int nPos = 0;
while(TRUE)
{
nPos = strString.Find(cr);
if (nPos == -1)
{
break;
}
strVec.push_back(strString.Left(nPos));
strString = strString.Right(strString.GetLength() - nPos -1);
}
if (strString != "")
{
strVec.push_back(strString);
}
return strVec;
}