MySQLのC++パッケージ

4888 ワード

最近のプロジェクトデータベース管理システムはSQL SERVER 2000から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クエリーアルゴリズムは、クエリーの速度を効果的に向上させます.クライアントサーバネットワーク環境で単独のアプリケーションとして実行することもできるし、他のソフトウェアに1つのライブラリとして埋め込むこともできる.中国語のGB 2312、BIG 5、日本語のShift JISなど、多くの言語サポートを提供し、データテーブル名とデータ列名として使用することができます.TCP/IP、ODBC、JDBCなど多くのデータベース接続ルートを提供します.データベース操作の管理、チェック、最適化に使用する管理ツールを提供します.数千万件のレコードを持つ大規模なデータベースを処理できます.
2.C++のAPIパッケージ
C++でSQLを接続するには、MySQL Connector/C++とMySQL++、<1>MySQL Connector/C++の2つの直接使用可能なインタフェースがあります.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++は、MySQLをC++でカプセル化したC APIのクラスライブラリです.標準C++標準ライブラリ(STL)を構築した上で、データベースを処理してSTLコンテナを処理するのと同じように簡単です.また、MySQLの++は、最も重複しない作業を提供し、オリジナルのC++インタフェースを提供します.
3.MySQLのC++パッケージ実装
プロトタイプを迅速に構築する過程で,この2つの接続方式は用いられず,MySQL C APIに直接カプセル化して実現した.
#ifndef __MYSQL_INTERFACE_H__
#define __MYSQL_INTERFACE_H__

#include "winsock.h"
#include 
#include 
#include "mysql.h"
#include 
#include 

#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<:vector> >& 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<: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;
	while(NULL!=line)
	{	
		std::vector<:string> linedata;
		for(int i=0; i