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

MySQL-C++封裝類

MySQLInterface.h:

// MySQLInterface

// 功能描述:實現對MySQL訪問操作的封裝

#ifndef __MYSQL_INTERFACE_H__  
#define __MYSQL_INTERFACE_H__  

#include <string>  
#include <vector>  

#include <winsock.h> // 遠端訪問
#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<std::vector<std::string> >& 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<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;
	std::vector<std::vector<std::string> >().swap(data);
	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;
}

// 其他操作
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);
}

Example

#include <iostream>

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::vector<std::string> > data;

         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;

}

錯誤提示

MFC (CString)

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;

    }

Win32

         if(!m_MySQLInter.Open())

         {

                  std::cout<< m_MySQLInter.ErrorNum << " : " <<m_MySQLInter.ErrorInfo << std::endl;

                  return;

         }

型別轉換

Std::string to char*

         // 型別轉換

         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);

CString to char*

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;

    }


相關推薦

MySQL-C++封裝

MySQLInterface.h: // MySQLInterface // 功能描述:實現對MySQL訪問操作的封裝 #ifndef __MYSQL_INTERFACE_H__ #define __MYSQL_INTERFACE_H__ #include &

mysqlc++封裝

//.h ////////////////////////////////////////////////////////////////////////////////// CppMysql - A C++ wrapper around the mysql database

multi-reactor伺服器模型的C++封裝(libevent+多執行緒實現)

最近在看memcached的原始碼,覺得它那種libevent+多執行緒的伺服器模型(multi-reactor)真的很不錯,我將這個模型封裝成一個C++類,根據我的簡單測試,這個模型的效率真的很不錯,歡迎大家試用。 這個類的使用方法很簡單(缺點是不太靈活),只

SQLite3資料庫Native C++封裝(Unicode)CppSQLite3U的初步認識與使用

SQLite3資料庫Native C++封裝類(Unicode)CppSQLite3U的初步認識與使用  by斜風細雨QQ:253786989    2012-02-12 (1)   從上面的網址可以找到對SQLite資料庫的C API的各種語言的封裝。包括c、c+

log4net的C#封裝

log4net是net界知名的日誌管理系統,開源的。它的用法適合各種環境異常、錯誤、日誌等的記錄和管理,但是同樣它諸多的方法函式讓初學者望而生畏。這裡的C#封裝類實現了log4net的二次封裝,對於日常的日誌管理足夠便利了。 封裝說明:    1.使用靜態方法呼叫即可寫入日

封裝之MYSQLHelper(C#連線MySql資料庫)

using System; using System.Collections; using System.Configuration; using MySql.Data; using MySql.Data.MySqlClient; using System.Da

C++ 用封裝實現隊列

pan pub pre () turn ear als sin push 1 #include<stdlib.h> 2 #include <iostream> 3 using std::cout; 4 using std::end

C#封裝CRUD到SqlHelper解讀

方便 object esc 參數 span tar 找到 area command 1、簡單說明一下,一般情況下,數據庫連接字符串是在App.config文件中進行配置,然後再在代碼中進行引用。因此,我們在這裏先看一下App.config文件。 首先看需要添加的內容: 參數

C++ log4cplus 庫的封裝

pat get 全局 attach ins 日誌 erro def ring 對 log4cplus 庫的封裝,修改自網路 LogUtils.h /* * LogUtils.h * * Created on: 2018年8月9日 * Author: o

C 操作Redis 簡單封裝

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

MySQLC++封裝

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

PHP自己封裝一個原生mysql資料庫工具--進階常用仿PDO模式

<?php header('content-type:text/html;charset=utf-8'); error_reporting(E_ALL ^ E_DEPRECATED); // 設計一個mysql資料庫操作類 $config=array(     'hos

PHP自己封裝一個原生mysql資料庫工具--基礎

程式碼都是剛從自己編輯器上拷貝下來的,可以直接複製黏貼執行。 <?php header('content-type:text/html;charset=utf-8'); error_reporting(E_ALL ^ E_DEPRECATED); // 設計一個mysql資料庫操作類 $

日曆---C++封裝一個Date,Calendar,實現簡單的日曆+日期計算器程式

C++封裝一個Date類,實現簡單的日曆程式 程式程式碼如下: Date.h #include<iostream> using namespace std; class Date { public: Date(int year = 200

c++:與物件,封裝,訪問限定符,預設成員函式

到底什麼是類?什麼是物件?          類是一個抽象的概念,它不存在於現實中的時間/空間裡,類只是為所有的物件定義了抽象的屬性與行為。          類是一個靜態的概念,類本身不攜帶任何

[C#原始碼]網路資料流讀寫封裝,支援多執行緒下同時讀和寫,自動資源管理,字串分隔符\r\n

using System; using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; using System.IO; using Syst

C# 封裝的功能強大的中國農曆日曆操作的程式碼

將程式碼過程經常用的程式碼片段備份一下,下邊資料是關於C# 封裝的功能強大的中國農曆日曆操作類的程式碼,希望能對大夥有些用途。 private static int leapDays(int y) { if (leapMonth(y) != 0) {

C 操作Redis 簡單封裝

                #include "stdafx.h"#include <stdio.h>#include <stdlib.h>#include <string.h>#include <winsock2.h>#include <iostre

PHP自己封裝一個原生mysql資料庫工具--進階常用

<?php header('content-type:text/html;charset=utf-8'); error_reporting(E_ALL ^ E_DEPRECATED); // 設計一個mysql資料庫操作類 $config=array(     'h

C++封裝的日期和時間

C++封裝的時間和日期類,方便的操作時間。包括時間段、日期類、時間類。支援 時間/日期 加/減/比較,時間戳/字串 相互轉換。 一個包含三個類:Duration、Date、Time。 Duration 表示一個時間段 Date 表示一個日期,精確到秒,比如20