日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql c api 封装_封装MySQL C API 基本操作

發布時間:2023/12/13 数据库 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql c api 封装_封装MySQL C API 基本操作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

根據我的以前的文章?http://blog.csdn.net/skyhuangdan/article/details/21099929 鏈接數據庫成功后進行封裝。

我封裝類使用的是VS2005下的win32控制臺應用程序編寫,預編譯頭文件了的。

所以要在 stdafx.h 里面加入 :

#include "CMySQL.h"

現在代碼奉上:

main函數代碼:mysql2.cpp

// mysql2.cpp : 定義控制臺應用程序的入口點。

//

#include "stdafx.h"

int main()

{

CMySQL mysql;

int re = mysql.Connect("localhost", "root", "123456");

mysql.ReConnect();

char buffer[1024] = {0};

while(1)

{

memset(buffer, 0, 1024);

printf("please input cmd:\n");

if( strcmp( "quit", gets(buffer)) != 0 )

{

if( (char) '1'== buffer[0] ){

mysql.SelectQuery(buffer+1);

}else{

mysql.ModifyQuery(buffer+1);

printf("Modify\n");

}

}else

break;

}

getchar();

}

CMySQL.h

#pragma once

#include

#include

#include

#include

using namespace std;

/*

#define ERRMSG1(fmt,...) ; sprintf(m_szErrMsg, fmt, __VA_ARGS__);

#define ERRMSG2(fmt,args...) ; sprintf(m_szErrMsg, "[%s 第 %d 行 ]; "fmt"\r\n" , __FILE__, __LINE__, ##args);

*/

class CMySQL

{

public:

CMySQL(void);

public:

~CMySQL(void);

public:

bool m_bConnected; //數據庫連接了嗎? true--已經連接; false--還沒有連接

char m_szErrMsg[1024]; //函數出錯后, 錯誤信息放在此處

int m_iFields; //字段個數

MYSQL m_connection; //連接

MYSQL_RES* m_result; //結果集指針

MYSQL_ROW m_row; //一行, typedef char **MYSQL_ROW;

private:

string m_sDbIp; //數據庫服務器IP

string m_sUser; //用戶名

string m_sPassword; //口令

public:

int Connect(const char* szDbIp, const char* szUser, const char* szPassword);

//關閉連接,無論之前是否已經連接,使用這個函數都不會有問題

void CloseConnect();

//判斷是否連接

bool IsConnected();

//連接標志

void SetConnected(bool bTrueFalse );

//重新連接

int ReConnect();

//用于執行查詢命令,并且把查詢到的結果集保存到m_result結果集里面

//!!此函數調用SelectPrint()函數!!

int SelectQuery(const char* szSQL);

//只是執行SQL命令

int ModifyQuery(const char* szSQL);

//返回錯誤信息

const char* GetErrMsg();

//保存連接參數

void SaveParam(const char* szDbIp, const char* szUser, const char* szPassword);

//釋放上次的結果

void FreePreResult();

//顯示結果?

void PrintSelect();

};

CMySQL.cpp:

#include "StdAfx.h"

#include "CMySQL.h"

CMySQL::CMySQL(void)

{

SetConnected(false);

//把結果集置空

m_result = NULL;

//初始化連接

mysql_init(&m_connection);

}

CMySQL::~CMySQL(void)

{

//釋放上一次的結果集

FreePreResult();

//關閉數據庫連接

CloseConnect();

}

int CMySQL::Connect(const char* szDbIp, const char* szUser, const char* szPassword)

{

SaveParam(szDbIp, szUser, szPassword);

//先判斷釋放已連接,防止重復連接

if (IsConnected())

return 0;

//連接數據庫

if (mysql_real_connect( &m_connection, szDbIp, szUser, szPassword, NULL, 0,NULL, 0) == NULL)

{

sprintf(m_szErrMsg,"%s" ,mysql_error(&m_connection));

return -1;

}

printf("[mysql] conn to %s [user:%s] succ!\r\n", szDbIp, szUser);

//設置連接標志為 true

SetConnected(true);

return 0;

}

void CMySQL::CloseConnect()

{

//不論m_connection曾經是否連接過, 這樣關閉都不會有問題

mysql_close(&m_connection);

SetConnected(false);

}

bool CMySQL::IsConnected() {

return m_bConnected;

}

void CMySQL::SetConnected(bool bTrueFalse)

{

m_bConnected = bTrueFalse;

}

void CMySQL::FreePreResult()

{

if (m_result != NULL)

{

mysql_free_result(m_result);

m_result = NULL;

}

}

int CMySQL::SelectQuery(const char* szSQL)

{

//如果查詢串是空指針,則返回

if (szSQL == NULL) {

sprintf(m_szErrMsg,"%s", "szSQL==NULL");

return -1;

}

//如果還沒有連接,則返回

if (!IsConnected()) {

sprintf(m_szErrMsg,"%s" , "還沒有建立連接");

return -2;

}

try //這些語句與連接有關,出異常時就重連

{

//查詢

if (mysql_real_query(&m_connection, szSQL, strlen(szSQL)) != 0)

{

sprintf(m_szErrMsg,"%s" , mysql_error(&m_connection));

printf("%s", mysql_error(&m_connection));

printf("ReConnect() is called, select111 !!!***@\r\n");

int nRet = ReConnect();

if (nRet != 0)

return -3;

//

if (mysql_real_query(&m_connection, szSQL, strlen(szSQL)) != 0)

return -33;

//

}

//釋放上一次的結果集

FreePreResult();

//取結果集

m_result = mysql_store_result(&m_connection);

if (m_result == NULL) {

sprintf(m_szErrMsg,"%s" , mysql_error(&m_connection));

return -4;

}

} catch (...) {

printf("ReConnect() is called, select !!!***@!@\r\n");

ReConnect();

return -5;

}

//取字段的個數

m_iFields = mysql_num_fields(m_result);

//查詢完過后進行打印出來

this->PrintSelect();

return 0;

}

int CMySQL::ReConnect() {

CloseConnect();

//連接數據庫

SetConnected(false);

//把結果集置空

m_result = NULL;

//初始化連接

mysql_init(&m_connection);

if (mysql_real_connect(&m_connection, m_sDbIp.c_str(), m_sUser.c_str(),m_sPassword.c_str(), NULL, 0, NULL, 0) == NULL)

{

sprintf(m_szErrMsg,"%s" , mysql_error(&m_connection));

return -1;

}

//設置連接標志為 true

SetConnected(true);

return 0;

}

const char* CMySQL::GetErrMsg() {

return m_szErrMsg;

}

void CMySQL::SaveParam(const char* szDbIp, const char* szUser,

const char* szPassword) {

m_sDbIp = szDbIp; //數據庫服務器IP

m_sUser = szUser; //用戶名

m_sPassword = szPassword; //口令

}

void CMySQL::PrintSelect()

{

printf("\n------------------------------------------------\n");

int num_fields = mysql_num_fields(m_result);

while ( m_row = mysql_fetch_row( m_result) )

{

for( int i = 0; i < num_fields; i++ )

{

if(m_row[i])

printf("%s ", m_row[i]);

else

printf("NULL");

}

printf("\n");

}

printf("\n------------------------------------------------\n");

}

int CMySQL::ModifyQuery(const char* szSQL) {

//如果查詢串是空指針,則返回

if (szSQL == NULL) {

sprintf(m_szErrMsg,"%s", "szSQL==NULL");

return -1;

}

//如果還沒有連接,則返回

if (!IsConnected()) {

sprintf(m_szErrMsg,"%s", "還沒有建立連接");

return -2;

}

try //這些語句與連接有關,出異常時就重連

{

//查詢, 實際上開始真正地修改數據庫

if (mysql_real_query(&m_connection, szSQL, strlen(szSQL)) != 0) {

sprintf(m_szErrMsg,"%s", mysql_error(&m_connection));

return -3;

}

} catch (...) {

printf("ReConnect() is called ,modify!!!***\r\n");

ReConnect();

return -5;

}

return 0;

}

注:

對于輸入的MySQL命令錯誤的情況下,程序會連接一遍,在程序關閉過后用于連接的關鍵字【MYSQL m_connection; 】必須要初始化,否則程序會出錯。

還有,重連過后,必須重新USE XXXXX; 因為重新連接那里并沒有自動連接你之前USE過的數據庫。

總結

以上是生活随笔為你收集整理的mysql c api 封装_封装MySQL C API 基本操作的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。