`
lppchina
  • 浏览: 51272 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类

Mysql API之C++封装(二)

阅读更多
前一篇文章是简单的连接数据库,查询数据库里面的记录,如果需要对记录的数据进行类型转换就比较麻烦了,下面的类可以帮助你利用struct很快的得到你想要的数据,参考如下。

DBClient_Struct.h:
#ifndef __DB_CLIENT_STRUCT_H__
#define __DB_CLIENT_STRUCT_H__

#include <mysql.h>
#include <string>

using namespace std;

//typedef std::string string; 

struct mysql_parm{ 
	string host;
	string user;
	string password;
	string database;
	int port;
};

class DBSTMT;
class DBMysql;

class DBSTMT{
	DBSTMT(const DBSTMT&);
	DBSTMT& operator=(const DBSTMT&);
	MYSQL_STMT* stmt_; 
public: 
	DBSTMT(char* query,DBMysql& mysql); 
	void execute(){ 
		if(mysql_stmt_execute(stmt_)) 
			throw mysql_stmt_error(stmt_); 
	} 

	void execute(MYSQL_BIND* bind){ 
		if(mysql_stmt_execute(stmt_)) 
			throw mysql_stmt_error(stmt_); 
		if(mysql_stmt_bind_result(stmt_,bind)){ 
			throw mysql_stmt_error(stmt_); 
		} 
		if(mysql_stmt_store_result(stmt_)) 
			throw mysql_stmt_error(stmt_); 
	} 

	//void execute(){ 
	// if(mysql_stmt_execute(stmt_)) 
	// throw mysql_stmt_error(stmt_); 
	//} 

	void bind(MYSQL_BIND* bind){ 
		if(mysql_stmt_bind_param(stmt_,bind) ) 
			throw mysql_stmt_error(stmt_); 
	} 

	int fetch(){ 
		return mysql_stmt_fetch(stmt_)==0; 
	} 
	~DBSTMT(){ 
		if(stmt_){ 
			mysql_stmt_close(stmt_); 
		} 
	} 

}; 


class DBMysql{ 
	DBMysql(const DBMysql&); 
	DBMysql&operator=(const DBMysql&); 
	MYSQL * mysqlPtr_; 

	long errno_; 
protected: 
	friend class DBSTMT; 
	MYSQL_STMT* _createSTMT(){ 
		MYSQL_STMT *ret=mysql_stmt_init(mysqlPtr_); 
		if(ret) 
			return ret; 
		errno_=mysql_errno(mysqlPtr_); 
		throw mysql_error(mysqlPtr_); 
	} 
public: 
	const char* strerr(){ 
		return mysql_error(mysqlPtr_); 
	} 
	DBMysql():mysqlPtr_(NULL){ 
		mysqlPtr_=mysql_init(NULL); 
		if(NULL== mysqlPtr_) 
			throw "Mysql :outof memory"; 
	} 
	void open(const mysql_parm& parm){ 
		if(!mysql_real_connect(mysqlPtr_, 
			parm.host.c_str(), 
			parm.user.c_str(), 
			parm.password.c_str(), 
			parm.database.c_str(), 
			0, 
			0, 
			0 )) 
		{ 
			errno_=mysql_errno(mysqlPtr_); 
			throw(mysql_error(mysqlPtr_)); 
		} 
	} 

	void close(){ 
		if(mysqlPtr_) 
		{ 
			mysql_close(mysqlPtr_); 
			mysqlPtr_=NULL; 
		} 
	} 
};

#define DECL_BIND(h,n)\
class bind_##h:public h{\
	typedef h parent;\
	MYSQL_BIND _bind[n];\
	my_bool _is_null[n];\
	unsigned long _length[n];\
public:\
	   bind_##h(){\
	   int i=0;\
	   memset(_bind, 0x00, sizeof(_bind));

#define BIND_BIN(x,l)\
	_bind.buffer_type= MYSQL_TYPE_STRING;\
	_bind[i].buffer= (char *)&(parent::x);\
	_bind[i].buffer_length= l;\
	_bind[i].is_null= _is_null+i;\
	_bind[i].length= _length+i;\
	++i;

#define BIND_INT(x)\
	_bind[i].buffer_type= MYSQL_TYPE_LONG;\
	_bind[i].buffer= (char *)&(parent::x);\
	_bind[i].buffer_length= 0;\
	_bind[i].is_null= _is_null+i;\
	_bind[i].length= _length+i;\
	++i;

#define BIND_TINY(x)\
	_bind[i].buffer_type= MYSQL_TYPE_TINY;\
	_bind[i].buffer= (char *)&(parent::x);\
	_bind[i].buffer_length= 0;\
	_bind[i].is_null= _is_null+i;\
	_bind[i].length= _length+i;\
	++i;

#define BIND_SHORT(x)\
	_bind[i].buffer_type= MYSQL_TYPE_SHORT;\
	_bind[i].buffer= (char *)&(parent::x);\
	_bind[i].buffer_length= 0;\
	_bind[i].is_null= _is_null+i;\
	_bind[i].length= _length+i;\
	++i;

#define END_BIND(h) }\
	operator MYSQL_BIND*(){\
	return _bind;\
	}\
};

#endif


DBClient_Struct.cpp:
#include "DBClient_Struct.h"

DBSTMT::DBSTMT(char* query,DBMysql& mysql):stmt_(NULL){ 
	stmt_=mysql._createSTMT(); 
	if(!stmt_)
		throw mysql.strerr();
	if( mysql_stmt_prepare(stmt_,query,strlen(query)) ) 
	{
		throw mysql_stmt_error(stmt_); 
	} 
}


实例Code如下:
typedef struct {
	uint16		conn;
	uint8		role;
	uint8		paired;
         uint8		bonded;
	uint8		authenticated;
	uint8		encrypted;
	uint8		sec_mode;
	uint8		sec_level;
	uint16		conn_interval;
	uint16		conn_latency;
	uint16		super_timeout;
} gap_link_status_t_4DB;

DECL_BIND(gap_link_status_t_4DB,11) 
	BIND_SHORT(conn)
	BIND_TINY(role)
	BIND_TINY(paired)
	BIND_TINY(bonded)
	BIND_TINY(authenticated)
	BIND_TINY(encrypted)
	BIND_TINY(sec_mode)
	BIND_TINY(sec_level)
	BIND_SHORT(conn_interval)
	BIND_SHORT(conn_latency)
	BIND_SHORT(super_timeout)
END_BIND(gap_link_status_t_4DB)

int main()
{
    	DBMysql dbmysql;
	mysql_parm dbparm;
	dbparm.host="localhost";
	dbparm.user="root"; 
	dbparm.password="t-span"; 
	dbparm.port = 0;
	dbparm.database="test";
	dbmysql.open(dbparm);

	DBSTMT smt("select conn,role,paired,bonded,authenticated,encrypted,sec_mode,sec_level,conn_interval,conn_latency,super_timeout\
			   from gap_link_status_t where id = 0;",dbmysql);

	bind_gap_link_status_t_4DB tmp_link; 
	smt.execute(tmp_link);

	while(smt.fetch()){
             printf("conn=%d, role=%d\n", tmp_link.conn, tmp_link.role);
	}; 
}


这个类的只支持简单的结构类型,不支持嵌套的结构,希望高手能够帮忙实现,谢谢!
分享到:
评论

相关推荐

    Mysql标准c++封装

    MySQL标准C++封装是将MySQL数据库的访问功能与C++编程语言相结合的一种技术,使得开发者可以使用C++的语法和特性来操作MySQL数据库。在Ubuntu操作系统下,这种封装经过了测试,确保了其在Linux环境中的兼容性和稳定...

    mysql c++ 封装类

    在C++中封装MySQL API,我们可以创建一个类,这个类将MySQL的C API函数封装为成员方法。例如,我们可以有如下的类设计: 1. `MySqlConnection` 类:代表一个到MySQL服务器的连接。它包含初始化和关闭连接的方法,如...

    MySql-C-API.rar_mysql api_mysql c++

    本项目提供了一个简单的 MySQL C API 的 C++ 封装,旨在帮助初学者更容易地理解和使用 MySQL API。 在 C++ 中封装 MySQL C API 可以使代码更整洁,更具面向对象特性,同时也方便了错误处理和资源管理。以下是一些...

    C++MYSQL API封装类及应用例子

    本篇将围绕"C++ MYSQL API封装类及应用例子"展开,详细介绍相关知识点。 首先,让我们了解MySQL API的基本概念。MySQL API是一组C语言编写的函数,它允许程序员通过C++或其他支持C接口的语言与MySQL服务器通信。...

    C++封装的mysql类

    利用mysql api 封装的 c++类 ,实现了mysql数据库的连接,查询以及增删改。 开发环境为vs2013+mysql5.7。 项目中已包含mysql5.7 的include、lib,下载后输入正确的用户信息及简单修改即可进行测试运行。 注意编译运行...

    mysql-connector-c++-1.1.9-winx64.rar_MYSQL_c# mysql_c++ 封装mysql_

    4. **C++封装MySQL** 封装MySQL通常涉及创建C++类,这些类将libmysql库的函数包装成更易于使用的成员方法。这包括连接数据库(`mysql_real_connect`)、执行SQL语句(`mysql_query`)、获取结果集(`mysql_store_...

    mysql C++封装类

    MySQL C++封装类是一种方便开发者在C++程序中与MySQL数据库进行交互的工具。它将MySQL的C API进行抽象和封装,提供了一套更符合C++编程习惯的接口,简化了数据库操作,使得代码更加简洁易读。在这个压缩包中,有两个...

    mysql c++封装类库 方便mysql编程

    这个"mysql c++封装类库"就是为了简化MySQL与C++之间的交互而设计的。 封装类库的核心思想是将数据库连接、查询执行、结果处理等操作包装在一个或多个C++类中。这样,程序员可以通过调用类的方法来实现对数据库的...

    C++ 封装的MYSQL 类

    本篇文章将详细探讨“C++封装的MYSQL类”,以及如何实现多条SQL语句的执行。 首先,我们来理解“封装”的概念。在面向对象编程(OOP)中,封装是核心原则之一,它隐藏了数据和功能的具体实现细节,仅对外提供接口。...

    mysql.rar_C++连接mysql_MYSQL连接_c 封装 mysql_mysql c++_mysql封装

    综上所述,"mysql.rar"中的源代码提供了使用C++封装MySQL C API的示例,这包括了数据库连接、查询和操作的实现。通过这样的封装,我们可以更方便地在C++项目中集成MySQL数据库功能,同时保持代码的清晰和高效。对于...

    一个封装了MySQL C API的C++连接池

    一个封装了MySQL C API的包了连接池的C++封装 CDBConnectionPool 连接池类 CDBConnection 连接对象 CDBRecordset 返回的记录集对象,开发人员只需要操作这个对象 DBDef.h,包含了所有对象定义

    c++封装MYSQL数据库连接代码

    在C++编程中,与MySQL数据库进行交互是常见的任务,特别是...以上就是关于"C++封装MYSQL数据库连接代码"的核心知识点。通过这样的封装,开发者可以方便地在C++应用程序中集成数据库操作,同时保持代码的整洁和模块化。

    mysql访问类 c++封装,linux平台和windows平台下都可用

    MySQL访问类C++封装是一种在C++编程语言中与MySQL数据库进行交互的方式,它使得开发者能够在C++程序中轻松地执行SQL查询、管理数据库连接、处理结果集等操作。这样的封装通常包括对MySQL C API的包装,以提供更面向...

    MYSQL++ C++ API

    通过深入理解和实践 MySQL++ C++ API,开发者可以轻松地构建高性能的数据库驱动的应用程序。无论是小型项目还是大型企业级系统,MySQL++ 都能提供可靠且高效的解决方案。在使用过程中,确保熟悉官方文档和社区资源,...

    简单封装的Mysql类(C++)

    在C++编程中,虽然MySQL官方提供了C API供开发者使用,但直接操作C API可能会涉及很多繁琐的细节,如错误处理、连接管理等。因此,为了简化开发过程,通常会进行一些封装,将常用的功能集成到一个类中。标题提到的...

    mysql封装.zip

    本压缩包"mysql封装.zip"提供了使用C++对MySQL数据库进行封装的代码示例,旨在简化MySQL在C++项目中的应用。 在C++中封装MySQL,通常会涉及到以下知识点: 1. **MySQL Connector/C++库**:这是MySQL官方提供的C++...

    mysql的c++ 基本API

    在MySQL的C++ API中,开发者可以通过一系列库函数来实现数据库的连接、查询、插入、更新和删除操作。下面我们将详细探讨这些关键知识点。 1. **MySQL C++ Connector**: MySQL提供了C++ Connector库,它允许C++...

    api_mysql.zip_mysql api_mysql c#_mysql c++_visual c

    在C++中,虽然可以使用C API(如上述的libmysqlclient),但也有更高级别的封装库,如`MySQL Connector/C++`,它提供了一个符合C++标准的面向对象接口,使开发更加高效。不过,这个压缩包没有直接包含C++的库文件,...

    c++ mysqlhelper 数据库访问层功能封装

    本篇文章将深入探讨如何使用C++封装一个名为`mysqlhelper`的数据库访问层,该层为MySQL数据库的访问提供了简洁且跨平台的解决方案。 `mysqlhelper`类封装了对MySQL数据库的基本操作,如连接、查询、执行SQL语句、...

    MySQL的C_API几个封装

    这个名字暗示可能是一个针对MySQL C API的C++11或更高版本的封装,可能使用了现代C++特性,如智能指针、RAII(Resource Acquisition Is Initialization)和异常安全。它可能包含更高级别的抽象,例如数据库连接管理...

Global site tag (gtag.js) - Google Analytics