仓酷云
标题:
发一篇一个Mysql C API小型封装
[打印本页]
作者:
因胸联盟
时间:
2015-1-16 20:14
标题:
发一篇一个Mysql C API小型封装
用户时常会发现其实自己并不是第一个选用MySQL数据库的先驱者。”
次要用于保护C布局的查询和前往。
#include[/size]
[size=13px]typedefstd::stringstring;[/size]
[size=13px]structMySQL_parm{
stringhost;
stringuser;
stringpassWord;
stringdatabase;
stringunixsock;
};
classDBSTMT;
classDBMysql;[/size]
[size=13px]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_);
}[/size]
[size=13px]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_);
}[/size]
[size=13px]//voidexecute(){
//if(mysql_stmt_execute(stmt_))
//throwmysql_stmt_error(stmt_);
//}[/size]
[size=13px]voidbind(MYSQL_BIND*bind){
if(mysql_stmt_bind_param(stmt_,bind))
throwmysql_stmt_error(stmt_);
}[/size]
[size=13px]intfetch(){
returnmysql_stmt_fetch(stmt_)==0;
}
~DBSTMT(){
if(stmt_){
mysql_stmt_close(stmt_);
}
}[/size]
[size=13px]};[/size]
[size=13px]
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[n];
my_bool_is_null[n];
unsignedlong_length[n];
public:
bind_##h(){
inti=0;
bzero(_bind,sizeof(_bind));
#defineBIND_BIN(x,l)
_bind[i].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;
#defineBIND_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;
#defineEND_BIND(h)}
operatorMYSQL_BIND*(){
return_bind;
}
};
利用办法;
比方想查询的内容具有以下布局
structaccount{
charuser[36];
bytepassword[16];
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
其实可以做一下类比,Oracle等数据库产品老早就支持了java编程,而且提供了java池参数作为用户配置接口。但是现在有哪些系统大批使用了java存储过程?!连Oracle自己的应用都不用为什么?!
作者:
变相怪杰
时间:
2015-1-27 07:28
光写几个SQL实在叫无知。
作者:
老尸
时间:
2015-2-5 06:06
可能有的朋友会抱怨集成的orderby,其实如果使用ranking函数,Orderby是少不了的。如果担心Orderby会影响效率,可以为orderby的字段建立聚集索引,查询计划会忽略orderby操作(因为本来就是排序的嘛)。
作者:
因胸联盟
时间:
2015-2-11 07:20
这一点很好的加强了profiler的功能。但是提到profiler提醒大家注意一点。windows2003要安装sp1补丁才能启动profiler。否则点击没有反应。
作者:
不帅
时间:
2015-3-2 00:06
groupby子句可以将查询结果分组,并返回行的汇总信息Oracle按照groupby子句中指定的表达式的值分组查询结果。
作者:
爱飞
时间:
2015-3-11 01:28
having子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having条件显示特定的组,也可以使用多个分组标准进行分组。
作者:
飘灵儿
时间:
2015-3-17 18:11
是否碎片会引发效率问题?这都是需要进一步探讨的东西。varbinary(max)代替image也让SQLServer的字段类型更加简洁统一。
作者:
透明
时间:
2015-3-24 20:46
我是新手,正在学习数据库和操作系统,深感理论的泛广,唯有一步一步来,但是又感觉时间不够,收集了很多资料却总是没能认真的看完,希望有一个讨论板块,大家共同解决,共同分享,共同努力
欢迎光临 仓酷云 (http://ckuyun.com/)
Powered by Discuz! X3.2