1. 程式人生 > >MySQL的C++封裝

MySQL的C++封裝

最近的專案資料庫管理系統從SQL SERVER2000遷移到了MySQL上來,之前基於ADO的連線方式連線上SQL SERVER,使用MySQL資料庫管理系統之後,直接在MySQL的C語言的API上以面向物件的方式封裝實現了資料庫的建立,表的建立,資料庫的讀寫操作快速搭建原型,目前沒有新增連線池模組和事務處理。


原始碼託管在github上https://github.com/figot/MySQLWrapper

1.MySQL的特性

使用C和C++編寫,並使用了多種編譯器進行測試,保證原始碼的可移植性。
支援AIX、BSDi、FreeBSD、HP-UX、Linux、Mac OS、Novell NetWare、NetBSD、OpenBSD、OS/2 Wrap、Solaris、Windows等多種作業系統。
為多種程式語言提供了API。這些程式語言包括C、C++、C#、VB.NET、Delphi、Eiffel、Java、Perl、PHP、Python、Ruby和Tcl等。
支援多執行緒,充分利用CPU資源,支援多使用者。
優化的SQL查詢演算法,有效地提高查詢速度。
既能夠作為一個單獨的應用程式在客戶端伺服器網路環境中執行,也能夠作為一個程式庫而嵌入到其他的軟體中。
提供多語言支援,常見的編碼如中文的GB 2312、BIG5,日文的Shift JIS等都可以用作資料表名和資料列名。
提供TCP/IP、ODBC和JDBC等多種資料庫連線途徑。
提供用於管理、檢查、優化資料庫操作的管理工具。
可以處理擁有上千萬條記錄的大型資料庫。

2.C++的API封裝

用C++連線SQL有兩種可直接使用的介面:MySQL Connector/C++和MySQL+ +,<1>MySQL Connector/C++是最新發布的MySQL聯結器,由Sun Microsystems開發。MySQL connector為C++提供面向物件的程式設計介面(API)和連線MySQL Server的資料庫驅動器與現存的driver不同,Connector/C++是JDBC API在C++中的實現。換句話說,Connector/C++ driver的介面主要是基於Java語言的JDBC API。Java資料庫連線(JDBC)是Java連線各種資料庫的業界標準。Connector/C++實現了JDBC 4.0的大部分規範。熟悉JDBC程式設計的C++程式開發者可以提高程式開發的效率。

<2>MySQL++是一個用C++封裝了MySQL的C API的類庫。它是建立標準C ++標準庫(STL)之上,使處理資料庫處理STL容器一樣容易。此外,MySQL的++提供了讓你避免最重複的工作,提供了原生C++介面。

3.MySQL的C++封裝實現

在快速搭建原型的過程中,沒有用到這兩種連線方式,直接在MySQL C API上封裝實現。

#ifndef __MYSQL_INTERFACE_H__
#define __MYSQL_INTERFACE_H__

#include "winsock.h"
#include <iostream>
#include <string>
#include "mysql.h"
#include <vector>
#include <string>

#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "libmysql.lib")
using namespace std;

class MySQLInterface
{
public:  
	MySQLInterface();
	virtual ~MySQLInterface();

	bool connectMySQL(char* server, char* username, char* password, char* database,int port);
	bool createDatabase(std::string& dbname);
	bool createdbTable(const std::string& query);

	void errorIntoMySQL();
	bool writeDataToDB(string queryStr);
	bool getDatafromDB(string queryStr, std::vector<std::vector<std::string> >& data);
	void closeMySQL();

public:
	int errorNum;                    //錯誤代號
	const char* errorInfo;             //錯誤提示

private:
	MYSQL mysqlInstance;                      //MySQL物件,必備的一個數據結構
	MYSQL_RES *result;                 //用於存放結果 建議用char* 陣列將此結果轉存
};

#endif


#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()
{

}

//連線MySQL
bool MySQLInterface::connectMySQL(char* server, char* username, char* password, char* database,int port)
{
	if(mysql_real_connect(&mysqlInstance,server,username,password,database,port,0,0) != NULL)
		return true;
	else
		errorIntoMySQL();
	return false;
}
//判斷資料庫是否存在,不存在則建立資料庫,並開啟
bool MySQLInterface::createDatabase(std::string& dbname)
{
	std::string queryStr = "create database if not exists ";
	queryStr += dbname;
	if (0 == mysql_query(&mysqlInstance,queryStr.c_str()))
	{
		queryStr = "use ";
		queryStr += dbname;
		if (0 == mysql_query(&mysqlInstance,queryStr.c_str()))
		{
			return true;
		}
		
	}
	errorIntoMySQL();
	return false;
}
//判斷資料庫中是否存在相應表,不存在則建立表
bool MySQLInterface::createdbTable(const std::string& query)
{
	if (0 == mysql_query(&mysqlInstance,query.c_str()))
	{
		return true;
	}
	errorIntoMySQL();
	return false;
}

//寫入資料
bool MySQLInterface::writeDataToDB(string queryStr)
{
	if(0==mysql_query(&mysqlInstance,queryStr.c_str()))
		return true;
	else
		errorIntoMySQL();
	return false;	
}
//讀取資料
bool MySQLInterface::getDatafromDB(string queryStr, std::vector<std::vector<std::string> >& 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;
	while(NULL!=line)
	{	
		std::vector<std::string> 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;
}

//錯誤資訊
void MySQLInterface::errorIntoMySQL()
{
	errorNum=mysql_errno(&mysqlInstance);
	errorInfo=mysql_error(&mysqlInstance);
}

//斷開連線
void MySQLInterface::closeMySQL()
{
	mysql_close(&mysqlInstance);
}