MySQLInterface.h:
// MySQLInterface
// 功能描述:实现对MySQL访问操作的封装
#ifndef __MYSQL_INTERFACE_H__
#define __MYSQL_INTERFACE_H__
#include
#include
#include // 远程访问
#include "MySQL/include/mysql.h"
// 引入相关库
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "MySQL/lib/libmysql.lib")
#define ERROR_QUERY_FAIL -1 // 操作失败
// 定义MySQL连接信息
typedef struct
{
char* server;
char* user;
char* password;
char* database;
int port;
}MySQLConInfo;
class MySQLInterface
{
public:
MySQLInterface();
virtual ~MySQLInterface();
void SetMySQLConInfo(char* server, char* username, char* password, char* database, int port);// 设置连接信息
bool Open(); // 打开连接
void Close(); // 关闭连接
bool Select(const std::string& Querystr, std::vector >& data); // 读取数据
bool Query(const std::string& Querystr); // 其他操作
int GetInsertID(const std::string& Querystr);// 插入并获取插入的ID,针对自动递增ID
void ErrorIntoMySQL(); // 错误消息
public:
int ErrorNum; // 错误代号
const char* ErrorInfo; // 错误提示
private:
MySQLConInfo MysqlConInfo; // 连接信息
MYSQL MysqlInstance; // MySQL对象
MYSQL_RES *Result; // 用于存放结果
};
#endif
MySQLInterface.cpp:
#include "stdafx.h"
#include "MySQLInterface.h"
MySQLInterface::MySQLInterface() :
ErrorNum(0), ErrorInfo("ok")
{
mysql_library_init(0, NULL, NULL);
mysql_init(&MysqlInstance);
// 设置字符集,否则无法处理中文
mysql_options(&MysqlInstance, MYSQL_SET_CHARSET_NAME, "gbk");
}
MySQLInterface::~MySQLInterface()
{
}
// 设置连接信息
void MySQLInterface::SetMySQLConInfo(char* server, char* username, char* password, char* database, int port)
{
MysqlConInfo.server = server;
MysqlConInfo.user = username;
MysqlConInfo.password = password;
MysqlConInfo.database = database;
MysqlConInfo.port = port;
}
// 打开连接
bool MySQLInterface::Open()
{
if (mysql_real_connect(&MysqlInstance, MysqlConInfo.server, MysqlConInfo.user,
MysqlConInfo.password, MysqlConInfo.database, MysqlConInfo.port, 0, 0) != NULL)
{
return true;
}
else
{
ErrorIntoMySQL();
return false;
}
}
// 断开连接
void MySQLInterface::Close()
{
mysql_close(&MysqlInstance);
}
//读取数据
bool MySQLInterface::Select(const std::string& Querystr, std::vector >& data)
{
if (0 != mysql_query(&MysqlInstance, Querystr.c_str()))
{
ErrorIntoMySQL();
return false;
}
Result = mysql_store_result(&MysqlInstance);
// 行列数
int row = mysql_num_rows(Result);
int field = mysql_num_fields(Result);
MYSQL_ROW line = NULL;
line = mysql_fetch_row(Result);
int j = 0;
std::string temp;
std::vector >().swap(data);
while (NULL != line)
{
std::vector linedata;
for (int i = 0; i < field; i++)
{
if (line[i])
{
temp = line[i];
linedata.push_back(temp);
}
else
{
temp = "";
linedata.push_back(temp);
}
}
line = mysql_fetch_row(Result);
data.push_back(linedata);
}
return true;
}
// 其他操作
bool MySQLInterface::Query(const std::string& Querystr)
{
if (0 == mysql_query(&MysqlInstance, Querystr.c_str()))
{
return true;
}
ErrorIntoMySQL();
return false;
}
// 插入并获取插入的ID,针对自动递增ID
int MySQLInterface::GetInsertID(const std::string& Querystr)
{
if (!Query(Querystr))
{
ErrorIntoMySQL();
return ERROR_QUERY_FAIL;
}
// 获取ID
return mysql_insert_id(&MysqlInstance);
}
//错误信息
void MySQLInterface::ErrorIntoMySQL()
{
ErrorNum = mysql_errno(&MysqlInstance);
ErrorInfo = mysql_error(&MysqlInstance);
}
#include using namespace std;
#include "MySQLInterface.h"
int _tmain(int argc, _TCHAR* argv[]) { MySQLInterface MySQLInterface; MySQLInterface.SetMySQLConInfo("localhost", "root", "123456", "world", 337); if (!MySQLInterface.Open()) { std::cout << MySQLInterface.ErrorNum << " : " << MySQLInterface.ErrorInfo << std::endl; }
// 读取数据 std::vector std::string sqlstr = "SELECT `ID`,`Name`,`CountryCode`,`District` FROM `world`.`city` LIMIT 10"; MySQLInterface.Select(sqlstr, data);
// 显示数据 for (unsigned int i = 0; i < data.size(); ++i) { for (unsigned int j = 0; j < data[0].size(); ++j) { cout << data[i][j] << "\t\t"; } cout << endl; }
// 其他操作 sqlstr = "CREATE TABLE IF NOT EXISTS `new_paper` ("; sqlstr += " `NewID` int(11) NOT NULL AUTO_INCREMENT,"; sqlstr += " `NewCaption` varchar(40) NOT NULL,"; sqlstr += " `NewContent` text,"; sqlstr += " `NewTime` datetime DEFAULT NULL,"; sqlstr += " PRIMARY KEY(`NewID`)"; sqlstr += " ) ENGINE = InnoDB DEFAULT CHARSET = utf8";
if (!MySQLInterface.Query(sqlstr)) { std::cout << MySQLInterface.ErrorNum << " : " << MySQLInterface.ErrorInfo << std::endl; }
MySQLInterface.Close();
system("pause"); return 0; } |
if (!m_MySQLInter.Open()) // 连接失败 { CString strError = _T(""); USES_CONVERSION; strError.Format(_T("打开数据库失败...\n%d : %s"), m_MySQLInter.ErrorNum, A2W(m_MySQLInter.ErrorInfo)); ::MessageBox(GetSafeHwnd(), strError, _T("系统提示"), MB_ICONEXCLAMATION | MB_OK); return; } |
if(!m_MySQLInter.Open())
{
std::cout<< m_MySQLInter.ErrorNum << " : " < return; } // 类型转换 char* pDatabase = new char[strlen(database.c_str()) + 1]; strcpy(pDatabase, database.c_str()); char* pPassword = new char[strlen(password.c_str()) + 1]; strcpy(pPassword, password.c_str()); char* pUserName = new char[strlen(usename.c_str()) + 1]; strcpy(pUserName, usename.c_str()); char* pServer = new char[strlen(server.c_str()) + 1]; strcpy(pServer, server.c_str()); m_MySQLInter.SetMySQLConInfo(pServer, pUserName, pPassword, pDatabase, port); USES_CONVERSION; m_MySQLInter.SetMySQLConInfo(W2A(m_strServer), W2A(m_strUserName), W2A(m_strPassword), "log", _ttoi(m_strPort)); if (!m_MySQLInter.Open()) // 连接失败 { CString strError = _T(""); USES_CONVERSION; strError.Format(_T("打开数据库失败...\n%d : %s"), m_MySQLInter.ErrorNum, A2W(m_MySQLInter.ErrorInfo)); ::MessageBox(GetSafeHwnd(), strError, _T("系统提示"), MB_ICONEXCLAMATION | MB_OK); return; } 类型转换
Std::string to char*
CString to char*