根据我的以前的文章 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 基本操作相关推荐

  1. mysql api接口_【MySQL学生手册】MySQL客户端接口

    章节概述 本章将介绍MySQL所使用的客户端客户端接口.在章节中,你将了解: MySQL所提供的客户端接口程序 在客户端接口进行区分并选择所需的接口 在MySQL网站上下载MySQL客户端接口程序 M ...

  2. mysql 中有什么命令_常用mysql命令大全

    常用的MySQL命令大全 连接MySQL格式: mysql -h主机地址 -u用户名 -p用户密码 1.例1:连接到本机上的MYSQL. 首先在打开DOS窗口,然后进入目录 mysqlbin,再键入命 ...

  3. 高性能mysql 第六章_高性能MySQL 第六章

    查询优化.索引优化.库表结构优化需要齐头并进,一个不落,才能最终设计出在实际场景中能发挥良好效果的方案. 为什么查询速度会慢? 如果把查询看作是一个任务,那么它由一系列子任务组成,每个子任务都会消耗一 ...

  4. mysql 客户服务号获取_《MySQL排错指南》——1.4 获取查询信息-阿里云开发者社区...

    本节书摘来自异步社区出版社<MySQL排错指南>一书中的第1章,第1.4节,作者:[美]Sveta Smirnova(斯维特 斯米尔诺娃),更多章节内容可以访问云栖社区"异步社区 ...

  5. mysql pmm 布署_给 mysql 安装 pmm 监控

    PMM 说明 PMM(Percona Monitoring and Management) 是一款监控和分析 MySQL 服务的一套工具,可以从图形化的方式看到 MySQL 服务的各种性能指标,慢查询 ...

  6. mysql 虚拟列索引_使用MySQL 5.7虚拟列提高查询效率

    原标题:使用MySQL 5.7虚拟列提高查询效率 导读 翻译团队:星耀队@知数堂 团队成员:星耀队-芬达,星耀队-顺子,星耀队-M哥 原文出处:https://www.percona.com/blog ...

  7. mysql数据库建仓范式_存mysql个数

    MySQL学习笔记之数据类型详解 注:以下内容针对MySQL5.0及以上版本 MySQL的数据类型非常多,选择正确的数据类型对于获得高性能至关重要,本文是我结合网上看到的一些blog加上<高性能 ...

  8. mysql 集群操作系统_高性能MySQL集群详解(二)

    一.通过Keepalived搭建MySQL双主模式的高可用集群系统 1.MySQL Replication介绍: MySQL Replication是MySQL自身提供的一个主从复制功能,其实也就是一 ...

  9. mysql主从数据库含义_(转)Mysql数据库主从心得整理

    管理mysql主从有2年多了,管理过200多组mysql主从,几乎涉及到各个版本的主从,本博文属于总结性的,有一部分是摘自网络,大部分是根据自己管理的心得和经验所写,整理了一下,分享给各位同行,希望对 ...

  10. mysql lint的范围_【MySQL】MySQL数据类型

    MySQL表数据存储大小说明 MySQL中规定,任何一条记录(数据表中每行数据)理论上的最大存储容量为 2^16 - 1 (Bytes) = 65535字节. MySQL数据类型思维导图 MySQL数 ...

最新文章

  1. (转) SpringBoot非官方教程 | 第二篇:Spring Boot配置文件详解
  2. 【Android Gradle 插件】Module 目录下 build.gradle 配置文件 ( android 闭包块配置 | AppExtension 扩展类型参考文档 )
  3. html输入邮箱的文本框,自动生成邮箱号并填入input输入框的实现方法
  4. 【网络安全】无需SOCKS支持,帮助广大渗透测试人员建立一条隐蔽的通信信道
  5. 物联网推动时代进步 中小玩家如何傍上运营商这棵大树
  6. Java调用.NET的WCF
  7. 数据结构学习笔记:实现链表
  8. 安卓案例:Okhttp3用法演示
  9. 【clickhouse】Clickhouse 集成 presto
  10. 【转贴】我对测试工作的一些认识
  11. webpack使用笔记
  12. [笔记]Qt5+FFMpeg+Opencv 实现实时美颜直播推流《一》基础知识以及直播服务器配置
  13. 泛微E9 获取附件内容,泛微Ecology9获取附件范例,Ecology9附件、E9 附件下载及上传集成平台
  14. Windows XP下用Modem发送传真(ZZ)
  15. 传统会计和计算机会计的职能,论会计信息化对传统财务会计职能的影响
  16. Pymediainfo读取文件夹视频长度并写入Excel文件(openpyxl)
  17. 自动驾驶系列(一) - 自动驾驶系统涉及哪些技术
  18. 【干货书】Python中的商业分析概念、技术和应用的数据挖掘
  19. c++读取文件夹下面的图片名称
  20. 原创 人脸检测 RetinaFace

热门文章

  1. python 取一个字前的文本的_python删除某一行字符前面的内容
  2. java xml 合并_Java中合并XML文档的设计与实现
  3. server新手引导 sql_Web SQL初体验之新手指导(全功能解析)
  4. mysql -a 参数_mysql参数及解释
  5. python编写安全工具_Python3学习系列(四):编写属于自己的邮件伪造工具
  6. 你真的懂点击率(CTR)建模吗?
  7. python3编码声明_python3编码问题汇总
  8. php微信分享接口调用,TP5的微信分享接口和JSSDK使用
  9. arraylist如何检测某一元素是否为空_我们应该如何理解Java集合框架的关键知识点?...
  10. JAVA_WEB--jsp概述