c/c++ 调用api操作mysql

近三个小时查阅、编码、测试,完成了一小部分内容,拿来分享下吧(因为开发使用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;
}



猜你喜欢

转载自blog.csdn.net/china_zyl/article/details/17465847
今日推荐