1. 程式人生 > >使用mysql++ 的一些api

使用mysql++ 的一些api

mysql++實際上就是把mysql本身的一些api進行一次封裝,是以面向物件的思想來處理問題了。 具體內容可以到網上查下我這裡就不多說了。 

這篇文章主要是舉一個完整的例子方便大家學習。

1、首先做好準備我們先來建立一個簡單的表這個我就不用命令了,因為不會。。。 只能用視覺化的工具呵呵。

    先使用navicat  premium 工具連線上自己的mysql

輸入自己的賬號密碼之後點選連線測試, 如果連線成功的話會顯示如下圖

  然後就是先建立一個測試使用的表

 滑鼠放在上圖的localhos 點選滑鼠右鍵 ---》  新建資料庫  按照下圖進行配置點選確定之後 資料庫就建好了

接下來開始建表

點選表裡的新建表


如上圖所示點選儲存並把名字填上去我起名為testInfo

OK 第一步準備工作已經完成接下來我們開始寫程式碼

1、 第一步連線資料庫

#pragma once
#include <mysql++.h>
// DatabaseInstance.h檔案
class DatabaseInstance
{
public:
	DatabaseInstance();
	~DatabaseInstance();

public:
	// 第一步開啟資料庫 成功返回true 失敗返回false
	bool open(const char* dbName, const char* host, const char* user, const char* passwd );

// 	//  第二部資料庫建立好,查詢物件也賦值了,開始執行sql語句
// 	bool execSQL( const char* sql );
// 
// 	// 第三步執行有返回結果的查詢
// 	bool querySQL( const char* sql, CppMySQLQuery& pQuery);
private:
	mysqlpp::Connection* m_pConn;  // 建立一個連線物件
};
// DatabaseInstance.cpp檔案
#include "DatabaseInstance.h"
DatabaseInstance::DatabaseInstance()
	:m_pConn(NULL)
{
	m_pConn = new mysqlpp::Connection(false);
}
DatabaseInstance::~DatabaseInstance()
{

}


bool DatabaseInstance::open(const char* dbName, const char* host, const char* user, const char* passwd )
{
	// 首先設定字符集   如果你不設定的話到時候存進去的utf8格式會亂碼
	if ( m_pConn-> set_option( new mysqlpp::SetCharsetNameOption("utf8")) )
	{
		// TODO:  設定字符集成功
	}

	// 連線資料庫
	if ( m_pConn->connect( dbName, host, user, passwd ) == false ) return false;

	// 用建立的m_pconn建立一個查詢物件
	printf("資料庫名:%s, 連線成功\n", dbName );
	return true;
}

// main.cpp檔案
#include <iostream>
#include "DatabaseInstance.h"

// 由於是單獨抽離出來的我就不再注意機構的優越性我直接在全域性宣告物件
DatabaseInstance database;
int main()
{
	// 第一步連線資料庫
	database.open( "testdb", "localhost", "root", "123456" );
	//// 第二部測試插入資料
	//database.execSQL("insert into testInfo(id,testValue1,testValue2) values(1,2,'helloworld')");
	//// 第三部分測試有返回結果的查詢
	//CppMySQLQuery mySqlQuery;
	//database.querySQL("select * from testInfo", mySqlQuery );
	//int id = mySqlQuery.getIntField("id");
	//int nValue = mySqlQuery.getIntField("testValue1");
	//const char* pcValue = mySqlQuery.getStringField("testValue2");

	//printf("查詢結果\n id:%d, testValue1:%d, testValue2:%s", id, nValue, pcValue );

	getchar();

	return 0;
}
第一步連線資料庫 注意 執行時會說有兩個檔案找不到libmysql.dll和mysqlpp_d.dll檔案, 這兩個檔案一個是mysql裡面的一個檔案一個是mysql++裡面的一個檔案, 直接拷貝的執行目錄下, 即你生成的.exe檔案的目錄下。

還有一點主要你必須把你的mysql++的配置檔案配好。 連線mysql++的庫要搞好了我上面的程式碼才成立。 還有我標頭檔案也是在配置檔案裡已經配置好的。


2、 連線上資料庫之後就是簡單的增刪改查了我這邊就直接把程式碼全部獻上

// DatabaseInstance.h檔案
#pragma once
#include <mysql++.h>

class CppMySQLQuery
{
	friend class DatabaseInstance;

public:
	CppMySQLQuery();

	virtual ~CppMySQLQuery();

public:
	// 獲得語句指標
	mysqlpp::StoreQueryResult* getQueryResultPlr(){ return &m_res; }

	// 一共查詢到多少行資料
	u_long numRow();

	// 一共有多少列
	unsigned int numFields();

	// 獲得列的型別暫時不知道什麼用  暫時不實現
	// ------------------------------------------

	// 獲得各種型別資料
	int getIntField( int nField, int nNullValue = 0 );
	int getIntField( const char* szField, int nNullValue = 0 );
	__int64 getLongField( int nField, __int64 nNullValue = 0 );
	__int64 getLongField( const char* szField, __int64 nNullValue = 0 );
	double getDoubleField( int nField, double fNullValue = 0.0f );
	double getDoubleField( const char* szField, double fNullValue = 0.0f );
	const char* getStringField( int nField, const char* szNullValue = "" );
	const char* getStringField( const char* szField, const char* szNullValue = "" );

	// 判斷是否是最後一行
	bool eof();

	// 將當前行數往下移動一行
	void nextRow();

	// 釋放資源
	void freeRes();

protected:
	//	int fieldIndex( const char* szField );
	// 判斷傳的字元是否在表中
	bool findFiledName(const char* pszField);

	// 逐字元轉換大寫為小寫
	static char* StringLower( const char* pString , char* out, int length = -1 );

private:

	mysqlpp::StoreQueryResult m_res;

	unsigned int m_CurselRow;
};

// DatabaseInstance.h檔案
class DatabaseInstance
{
public:
	DatabaseInstance();
	~DatabaseInstance();

public:
	// 第一步開啟資料庫 成功返回true 失敗返回false
	bool open(const char* dbName, const char* host, const char* user, const char* passwd );

 	//  第二部資料庫建立好,查詢物件也賦值了,開始執行sql語句
 	bool execSQL( const char* sql );
 
 	// 第三步執行有返回結果的查詢
 	bool querySQL( const char* sql, CppMySQLQuery& pQuery);
private:
	mysqlpp::Connection* m_pConn;  // 建立一個連線物件
};

// DatabaseInstance.cpp 檔案
#include "DatabaseInstance.h"

// CppMySQLQuery 所有成員函式定義
CppMySQLQuery::CppMySQLQuery()
	:m_CurselRow(0)
{
	m_res.clear();
}

CppMySQLQuery::~CppMySQLQuery()
{

}

u_long CppMySQLQuery::numRow()
{
	if ( m_res.empty() )
	{
		return 0;
	}
	int a = m_res.num_rows();
	return ( u_long )m_res.num_rows();
}

unsigned int CppMySQLQuery::numFields()
{
	if ( m_res.empty() )
	{
		return 0;
	}
	return m_res.num_fields();
}

int CppMySQLQuery::getIntField( int nField, int nNullValue /*= 0*/ )
{
	if ( m_res.empty() || nField + 1 > (int)numFields() || numRow() == 0 )
	{
		return nNullValue;
	}

	return (int)m_res[ m_CurselRow ][ nField ];
}

int CppMySQLQuery::getIntField( const char* szField, int nNullValue /*= 0*/ )
{
	if ( m_res.empty() || 0 == numRow() || findFiledName( szField ) == false )
	{
		return nNullValue;
	}

	return m_res[m_CurselRow][szField];
}

__int64 CppMySQLQuery::getLongField( int nField, __int64 nNullValue /*= 0*/ )
{
	if ( m_res.empty() || nField + 1 > (int)numFields() || 0 == numRow() )
	{
		return nNullValue;
	}

	return m_res[ m_CurselRow ][ nField ];
}

__int64 CppMySQLQuery::getLongField( const char* szField, __int64 nNullValue /*= 0*/ )
{
	if ( m_res.empty() || NULL == szField || 0 == numRow() || findFiledName( szField ) == false )
	{
		return nNullValue;
	}

	return m_res[ m_CurselRow ][ szField ];

}

double CppMySQLQuery::getDoubleField( int nField, double fNullValue /*= 0*/ )
{
	if ( m_res.empty() || nField + 1 > (int)numFields() || 0 == numRow() )
	{
		return fNullValue;
	}

	return m_res[ m_CurselRow ][ nField ];
}

double CppMySQLQuery::getDoubleField( const char* szField, double fNullValue /*= 0.0f*/ )
{
	if ( m_res.empty() || NULL == szField || 0 == numRow() || findFiledName( szField ) == false )
	{
		return fNullValue;
	}
	return m_res[ m_CurselRow ][ szField ];
}

const char* CppMySQLQuery::getStringField( int nField, const char* szNullValue /*= ""*/ )
{
	if ( m_res.empty() || nField + 1 > (int)numFields() || 0 == numRow() )
	{
		return szNullValue;
	}
	return m_res[ m_CurselRow ][ nField ];
}

const char* CppMySQLQuery::getStringField( const char* szField, const char* szNullValue /*= ""*/ )
{
	if ( m_res.empty() || NULL == szField || 0 == numRow() || findFiledName( szField ) == false)
	{
		return szNullValue;
	}
	return m_res[ m_CurselRow ][ szField ];
}

void CppMySQLQuery::nextRow()
{
	if ( m_res.empty() ) return;

	m_CurselRow++;

}

void CppMySQLQuery::freeRes()
{
	if ( m_res.empty() )
	{
		m_res.clear();
	}
}

bool CppMySQLQuery::eof()
{
	if ( m_CurselRow >= m_res.size() ) return true;

	return false;
}

bool CppMySQLQuery::findFiledName(const char* pszField)
{
	int nCol = numFields();

	int nCount = strlen( pszField );

	char szNewField[512];
	for ( int i = 0; i < nCol; ++i )
	{
		memset( szNewField, 0, 512 );
		std::string szStr = m_res.field_name(i);
		StringLower( pszField, szNewField );
		if ( szStr == szNewField ) return true;
	}

	return false;
}

char* CppMySQLQuery::StringLower( const char* pString , char* out, int length /*= -1*/ )
{
	if( length == -1 )
		length = (int)strlen( pString );
	int i;
	for(i = 0;i < length;i ++ )
	{
		out[i] = tolower( pString[i] );
	}
	out[i] = 0; 
	return out;
}




DatabaseInstance::DatabaseInstance()
	:m_pConn(NULL)
{
	m_pConn = new mysqlpp::Connection(false);
}
DatabaseInstance::~DatabaseInstance()
{

}


bool DatabaseInstance::open(const char* dbName, const char* host, const char* user, const char* passwd )
{
	// 首先設定字符集   如果你不設定的話到時候存進去的utf8格式會亂碼
	if ( m_pConn-> set_option( new mysqlpp::SetCharsetNameOption("utf8")) )
	{
		// TODO:  設定字符集成功
	}

	// 連線資料庫
	if ( m_pConn->connect( dbName, host, user, passwd ) == false ) return false;

	// 用建立的m_pconn建立一個查詢物件
	printf("資料庫名:%s, 連線成功\n", dbName );
	return true;
}

bool DatabaseInstance::execSQL( const char* sql )
{
	mysqlpp::Query  query = m_pConn->query();

	std::string str = sql;
	if ( query.exec(str) == false )
	{
		printf("%s failed", str.c_str());
		return false;
	}

	printf(" 執行sql語句 %s success\n", str.c_str() );
	return true;
}

bool DatabaseInstance::querySQL( const char* sql, CppMySQLQuery& pQuery)
{
	mysqlpp::Query query = m_pConn->query();
	// 將sql語句執行,查詢到的結果在query.store()裡
	query << sql;

	// 獲得查詢結果物件 這個我是已經封裝好的你可以進去看一下
	mysqlpp::StoreQueryResult* pQueryResult = pQuery.getQueryResultPlr();
	// 將結果賦值給結果物件
	*pQueryResult = query.store();
	return true;
}

// main.cpp檔案
#include <iostream>
#include "DatabaseInstance.h"

// 由於是單獨抽離出來的我就不再注意機構的優越性我直接在全域性宣告物件
DatabaseInstance database;
int main()
{
	// 第一步連線資料庫
	database.open( "testdb", "localhost", "root", "123456" );
	// 第二部測試插入資料
	database.execSQL("insert into testInfo(id,testValue1,testValue2) values(1,2,'helloworld')");
	// 第三部分測試有返回結果的查詢
	CppMySQLQuery mySqlQuery;
	database.querySQL("select * from testInfo", mySqlQuery );
	int id = mySqlQuery.getIntField("id");
	int nValue = mySqlQuery.getIntField("testValue1");
	const char* pcValue = mySqlQuery.getStringField("testValue2");

	printf("查詢結果\n id:%d, testValue1:%d, testValue2:%s", id, nValue, pcValue );

	getchar();

	return 0;
}

再次強調我的程式碼可以正常執行的前提是mysql++的庫你已經配置好  一下我將我的配置檔案  及路徑貼給大家


上圖是附加的包含目錄, 因此我標頭檔案可以直接新增不需要新增路徑


這個是我的檔案路徑  你可以跟上圖的附加包含目錄對應看下


這個是mysql++的庫檔案 ,  注意你需要把常規裡面的附加庫目錄配置好

以上是基本的mysql++的增刪改查的方法, 如果有什麼問題歡迎騷擾  郵箱[email protected]