溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

c++中怎么實現(xiàn)一個mysql通用類

發(fā)布時間:2021-08-03 16:56:59 來源:億速云 閱讀:146 作者:Leah 欄目:數(shù)據(jù)庫

本篇文章給大家分享的是有關(guān)c++中怎么實現(xiàn)一個mysql通用類,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

常用的函數(shù)

初始化API庫:mysql_library_init() 

初始化數(shù)據(jù)結(jié)構(gòu):mysql_init()

連接數(shù)據(jù)庫前的選項:mysql_options()

錯誤信息:mysql_error()

連接函數(shù):mysql_real_connect()

執(zhí)行SQL語句:mysql_query()

轉(zhuǎn)存查詢結(jié)果:mysql_store_result()

關(guān)閉連接:mysql_close()

dbctrl.h

#ifndef __DBCTRL_H__
#define __DBCTRL_H__

#include "winsock.h"
#include "iostream.h"
#include <string>
#include "mysql.h"
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "libmysql.lib")
using namespace std;

class DBctrl
{
	private:
		MYSQL mydata;                      //MySQL對象,必備的一個數(shù)據(jù)結(jié)構(gòu)
		MYSQL_RES *result;                 //用于存放結(jié)果 建議用char* 數(shù)組將此結(jié)果轉(zhuǎn)存
	public:
		int   row;                         //查詢結(jié)果的行數(shù)
		int   field;                       //查詢結(jié)果的列數(shù)
		int   autoNum;                     //上一次auto_increment的值
		int   errorNum;                    //錯誤代號
		const char* errorInfo;             //錯誤提示
		int   affectedRow;                 //上一次查詢影響的行數(shù)
		

		DBctrl();                          //構(gòu)造函數(shù)

		void DBtest(int flag);            
		void DBerror();
		void DBconn(char* server, char* username, char* password, char* database,int port);
		void DBquery(string queryStr);
		void DBquery(string queryStr, char* data[100][100]);
		void DBclose();
};

#endif

dbctrl.cpp

#include "dbctrl.h"

//構(gòu)造函數(shù) 初始化各個變量和數(shù)據(jù)
DBctrl::DBctrl()
{
	mysql_library_init(0,NULL,NULL);
	mysql_init(&mydata);
	mysql_options(&mydata,MYSQL_SET_CHARSET_NAME,"gbk");

	row=0;
	field=0;
	autoNum=0;
	errorNum=0;
	errorInfo="ok";
	affectedRow=0;
}

//編譯時顯示測試信息,正式使用時把此函數(shù)主題注釋掉即可
void DBctrl::DBtest(int flag)
{
	char* message;
	switch (flag)
	{
		case 1:
			message="Database OK!";
			break;
		case 2:
			message="Database error!";
			break;
		case 3:
			message="Query OK!";
			break;
		case 4:
			message="Query error!";
			break;
		case 5:
			message="data overflew!";
			break;
		default:
			message=NULL;
			break;
	}
	if (message!=NULL) cout<<message<<endl;
}

//收集錯誤信息
void DBctrl::DBerror()
{
	errorNum=mysql_errno(&mydata);
	errorInfo=mysql_error(&mydata);
}

//連接數(shù)據(jù)庫
void DBctrl::DBconn(char* server, char* username, char* password, char* database,int port)
{
	char* svr=server;    //server:服務器域名或IP
	char* usr=username;  //username:數(shù)據(jù)庫用戶名
	char* pwd=password;  //password:數(shù)據(jù)庫密碼
	char* dbn=database;  //database:數(shù)據(jù)庫名
	int   prt=port;      //port:端口號

	//這里新建變量并再賦一次值是為了調(diào)試的時候顯示連接參數(shù),其實可以不這么做
	if(mysql_real_connect(&mydata,svr,usr,pwd,dbn,prt,0,0) != NULL)
		DBtest(1);
	else
		DBtest(2);
}

//執(zhí)行查詢語句
void DBctrl::DBquery(string queryStr)
{
	if(0==mysql_query(&mydata,queryStr.c_str()))
		DBtest(3);
	else
		DBtest(4);
	DBerror();
}

//執(zhí)行查詢語句(重載,有返回結(jié)果的)
void DBctrl::DBquery(string queryStr, char* data[100][100])
{
	if(0==mysql_query(&mydata,queryStr.c_str()))
		DBtest(3);
	else
		DBtest(4);

	affectedRow=mysql_affected_rows(&mydata);
	autoNum=mysql_insert_id(&mydata);
	result=mysql_store_result(&mydata);

	row=mysql_num_rows(result);//計算行數(shù)
	field=mysql_num_fields(result);//計算列數(shù)

	//轉(zhuǎn)出數(shù)據(jù)
	if(row>100 || field>100)
		DBtest(5);
	else
	{
		MYSQL_ROW line=NULL;
		line=mysql_fetch_row(result);//取第一行結(jié)果

		int j=0;
		while(NULL!=line)//查看是否為空行,是則結(jié)束,否則將這一行的數(shù)據(jù)轉(zhuǎn)存到data的一行中并取下一行
		{	
			for(int i=0; i<field;i++)
			{
				data[j][i]=line[i];
			}
			j++;
			line=mysql_fetch_row(result);
		}
	}

	DBerror();
}

//斷開連接
void DBctrl::DBclose()
{
	mysql_close(&mydata);
}

主體

    #include "dbctrl.h"  
      
    void main()  
    {  
        DBctrl my;              //剛才建的通用類  
        string query;           //存放查詢語句  
        char*  data[100][100];  //存放查詢結(jié)果  
      
        query="Select * from table1";  
        my.DBconn("localhost","root","123456","test",3306);  
        my.DBquery(query,data); //執(zhí)行query中的語句,并將結(jié)果回送給data  
        my.DBclose();           //關(guān)閉連接  
      
        /* 此處用for循環(huán)顯示data數(shù)組的內(nèi)容... */  
    }

以上就是c++中怎么實現(xiàn)一個mysql通用類,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降摹OM隳芡ㄟ^這篇文章學到更多知識。更多詳情敬請關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI