|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
用户时常会发现其实自己并不是第一个选用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获得这种可扩展性的路径之一是通过一个人们所熟知的存储过程,这是一个运行在程序之外的微型、预编译程序。 |
|