因胸联盟 发表于 2015-1-16 20:14:28

发一篇一个Mysql C API小型封装

用户时常会发现其实自己并不是第一个选用MySQL数据库的先驱者。”次要用于保护C布局的查询和前往。

#include
typedefstd::stringstring;
structMySQL_parm{
stringhost;
stringuser;
stringpassWord;
stringdatabase;
stringunixsock;
};
classDBSTMT;
classDBMysql;
classDBSTMT{
DBSTMT(constDBSTMT&);
DBSTMT&Operator=(constDBSTMT&);
MYSQL_STMT*stmt_;
public:
DBSTMT(pcsz_tquery,DBMysql&mysql);
voidexecute(){
if(mysql_stmt_execute(stmt_))
throwmysql_stmt_error(stmt_);
}
voidexecute(MYSQL_BIND*bind){
if(mysql_stmt_execute(stmt_))
throwmysql_stmt_error(stmt_);
if(mysql_stmt_bind_result(stmt_,bind)){
throwmysql_stmt_error(stmt_);
}
if(mysql_stmt_store_result(stmt_))
throwmysql_stmt_error(stmt_);
}
//voidexecute(){
//if(mysql_stmt_execute(stmt_))
//throwmysql_stmt_error(stmt_);
//}
voidbind(MYSQL_BIND*bind){
if(mysql_stmt_bind_param(stmt_,bind))
throwmysql_stmt_error(stmt_);
}
intfetch(){
returnmysql_stmt_fetch(stmt_)==0;
}
~DBSTMT(){
if(stmt_){
mysql_stmt_close(stmt_);
}
}
};

classDBMysql{
DBMysql(constDBMysql&);
DBMysql&operator=(constDBMysql&);
MYSQL*mysqlPtr_;
uint32_terrno_;
PRotected:
friendclassDBSTMT;
MYSQL_STMT*_createSTMT(){
MYSQL_STMT*ret=mysql_stmt_init(mysqlPtr_);
if(ret)
returnret;
errno_=mysql_errno(mysqlPtr_);
throwmysql_error(mysqlPtr_);
}
public:
constchar*strerr(){
returnmysql_error(mysqlPtr_);
}
DBMysql():mysqlPtr_(NULL){
mysqlPtr_=mysql_init(NULL);
if(NULL==mysqlPtr_)
throw"Mysql:outofmemory";
}
voidopen(constmysql_parm&parm){
if(!mysql_real_connect(mysqlPtr_,
parm.host.c_str(),
parm.user.c_str(),
parm.password.c_str(),
parm.database.c_str(),
0,
parm.unixsock.c_str(),
0))
{
errno_=mysql_errno(mysqlPtr_);
throw(mysql_error(mysqlPtr_));
}
}
voidclose(){
if(mysqlPtr_)
{
mysql_close(mysqlPtr_);
mysqlPtr_=NULL;
}
}
};

DBSTMT::DBSTMT(pcsz_tquery,DBMysql&mysql):stmt_(NULL){
stmt_=mysql._createSTMT();
if(!stmt_)
throwmysql.strerr();
if(mysql_stmt_prepare(stmt_,query,strlen(query)))
{
//constchar*err=
throwmysql_stmt_error(stmt_);
}
}
#defineDECL_BIND(h,n)
classbind_##h:publich{
typedefhparent;
MYSQL_BIND_bind;
my_bool_is_null;
unsignedlong_length;
public:
bind_##h(){
inti=0;
bzero(_bind,sizeof(_bind));

#defineBIND_BIN(x,l)
_bind.buffer_type=MYSQL_TYPE_STRING;
_bind.buffer=(char*)&(parent::x);
_bind.buffer_length=l;
_bind.is_null=_is_null+i;
_bind.length=_length+i;
++i;
#defineBIND_INT(x)
_bind.buffer_type=MYSQL_TYPE_LONG;
_bind.buffer=(char*)&(parent::x);
_bind.buffer_length=0;
_bind.is_null=_is_null+i;
_bind.length=_length+i;
++i;
#defineEND_BIND(h)}
operatorMYSQL_BIND*(){
return_bind;
}
};


利用办法;
比方想查询的内容具有以下布局
structaccount{
charuser;
bytepassword;
uint32_tstatus;
uint32_tid;
};
//声明查询bind布局account,参数4个
DECL_BIND(account,4)
BIND_BIN(user,32)
BIND_BIN(password,16)
BIND_INT(status)
BIND_INT(id)
END_BIND(account)
intmain(){
try{

DBMysqlmysql;
mysql_parmparm;
parm.host="localhost";
parm.user="root";
parm.password="test";
parm.unixsock="/var/lib/mysql/mysql.sock";
parm.database="testdb";
mysql.open(parm);//翻开数据库

DBSTMTsmt("selectuser,password,status,idfromaccount",mysql);//天生一个查询语法
DBSTMTsmt1("insertintoaccount(user,password,status)value(?,?,?)",mysql);//别的一个
//

bind_accountacc;


smt.execute(acc);//实行查询,并bind前往了局到account布局
while(smt.fetch()){
printf("%s%d%d
",acc.user,acc.status,acc.id);

};
smt1.bind(acc);//bind查询参数
smt1.execute();//实行



}catch(constchar*err){
printf("error:%s
",err);
}
}
你可以配置MySQL运行在微小的嵌入式应用程序中,处理的数据可能不足1Mb??而你也可以用它来处理数Tb的数据。MySQL获得这种可扩展性的路径之一是通过一个人们所熟知的存储过程,这是一个运行在程序之外的微型、预编译程序。

活着的死人 发表于 2015-1-18 19:06:56

其实可以做一下类比,Oracle等数据库产品老早就支持了java编程,而且提供了java池参数作为用户配置接口。但是现在有哪些系统大批使用了java存储过程?!连Oracle自己的应用都不用为什么?!

变相怪杰 发表于 2015-1-27 07:28:17

光写几个SQL实在叫无知。

老尸 发表于 2015-2-5 06:06:45

可能有的朋友会抱怨集成的orderby,其实如果使用ranking函数,Orderby是少不了的。如果担心Orderby会影响效率,可以为orderby的字段建立聚集索引,查询计划会忽略orderby操作(因为本来就是排序的嘛)。

因胸联盟 发表于 2015-2-11 07:20:01

这一点很好的加强了profiler的功能。但是提到profiler提醒大家注意一点。windows2003要安装sp1补丁才能启动profiler。否则点击没有反应。

不帅 发表于 2015-3-2 00:06:54

groupby子句可以将查询结果分组,并返回行的汇总信息Oracle按照groupby子句中指定的表达式的值分组查询结果。

爱飞 发表于 2015-3-11 01:28:43

having子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having条件显示特定的组,也可以使用多个分组标准进行分组。

飘灵儿 发表于 2015-3-17 18:11:36

是否碎片会引发效率问题?这都是需要进一步探讨的东西。varbinary(max)代替image也让SQLServer的字段类型更加简洁统一。

透明 发表于 2015-3-24 20:46:50

我是新手,正在学习数据库和操作系统,深感理论的泛广,唯有一步一步来,但是又感觉时间不够,收集了很多资料却总是没能认真的看完,希望有一个讨论板块,大家共同解决,共同分享,共同努力
页: [1]
查看完整版本: 发一篇一个Mysql C API小型封装