仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 858|回复: 8
打印 上一主题 下一主题

[学习教程] 发一篇一个Mysql C API小型封装

[复制链接]
因胸联盟 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 20:14:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
用户时常会发现其实自己并不是第一个选用MySQL数据库的先驱者。”次要用于保护C布局的查询和前往。
  1. #include[/size]
  2. [size=13px]typedefstd::stringstring;[/size]
  3. [size=13px]structMySQL_parm{
  4. stringhost;
  5. stringuser;
  6. stringpassWord;
  7. stringdatabase;
  8. stringunixsock;
  9. };
  10. classDBSTMT;
  11. classDBMysql;[/size]
  12. [size=13px]classDBSTMT{
  13. DBSTMT(constDBSTMT&);
  14. DBSTMT&Operator=(constDBSTMT&);
  15. MYSQL_STMT*stmt_;
  16. public:
  17. DBSTMT(pcsz_tquery,DBMysql&mysql);
  18. voidexecute(){
  19. if(mysql_stmt_execute(stmt_))
  20. throwmysql_stmt_error(stmt_);
  21. }[/size]
  22. [size=13px]voidexecute(MYSQL_BIND*bind){
  23. if(mysql_stmt_execute(stmt_))
  24. throwmysql_stmt_error(stmt_);
  25. if(mysql_stmt_bind_result(stmt_,bind)){
  26. throwmysql_stmt_error(stmt_);
  27. }
  28. if(mysql_stmt_store_result(stmt_))
  29. throwmysql_stmt_error(stmt_);
  30. }[/size]
  31. [size=13px]//voidexecute(){
  32. //if(mysql_stmt_execute(stmt_))
  33. //throwmysql_stmt_error(stmt_);
  34. //}[/size]
  35. [size=13px]voidbind(MYSQL_BIND*bind){
  36. if(mysql_stmt_bind_param(stmt_,bind))
  37. throwmysql_stmt_error(stmt_);
  38. }[/size]
  39. [size=13px]intfetch(){
  40. returnmysql_stmt_fetch(stmt_)==0;
  41. }
  42. ~DBSTMT(){
  43. if(stmt_){
  44. mysql_stmt_close(stmt_);
  45. }
  46. }[/size]
  47. [size=13px]};[/size]
  48. [size=13px]
  49. classDBMysql{
  50. DBMysql(constDBMysql&);
  51. DBMysql&operator=(constDBMysql&);
  52. MYSQL*mysqlPtr_;
  53. uint32_terrno_;
  54. PRotected:
  55. friendclassDBSTMT;
  56. MYSQL_STMT*_createSTMT(){
  57. MYSQL_STMT*ret=mysql_stmt_init(mysqlPtr_);
  58. if(ret)
  59. returnret;
  60. errno_=mysql_errno(mysqlPtr_);
  61. throwmysql_error(mysqlPtr_);
  62. }
  63. public:
  64. constchar*strerr(){
  65. returnmysql_error(mysqlPtr_);
  66. }
  67. DBMysql():mysqlPtr_(NULL){
  68. mysqlPtr_=mysql_init(NULL);
  69. if(NULL==mysqlPtr_)
  70. throw"Mysql:outofmemory";
  71. }
  72. voidopen(constmysql_parm&parm){
  73. if(!mysql_real_connect(mysqlPtr_,
  74. parm.host.c_str(),
  75. parm.user.c_str(),
  76. parm.password.c_str(),
  77. parm.database.c_str(),
  78. 0,
  79. parm.unixsock.c_str(),
  80. 0))
  81. {
  82. errno_=mysql_errno(mysqlPtr_);
  83. throw(mysql_error(mysqlPtr_));
  84. }
  85. }
  86. voidclose(){
  87. if(mysqlPtr_)
  88. {
  89. mysql_close(mysqlPtr_);
  90. mysqlPtr_=NULL;
  91. }
  92. }
  93. };
  94. DBSTMT::DBSTMT(pcsz_tquery,DBMysql&mysql):stmt_(NULL){
  95. stmt_=mysql._createSTMT();
  96. if(!stmt_)
  97. throwmysql.strerr();
  98. if(mysql_stmt_prepare(stmt_,query,strlen(query)))
  99. {
  100. //constchar*err=
  101. throwmysql_stmt_error(stmt_);
  102. }
  103. }
  104. #defineDECL_BIND(h,n)
  105. classbind_##h:publich{
  106. typedefhparent;
  107. MYSQL_BIND_bind[n];
  108. my_bool_is_null[n];
  109. unsignedlong_length[n];
  110. public:
  111. bind_##h(){
  112. inti=0;
  113. bzero(_bind,sizeof(_bind));
  114. #defineBIND_BIN(x,l)
  115. _bind[i].buffer_type=MYSQL_TYPE_STRING;
  116. _bind[i].buffer=(char*)&(parent::x);
  117. _bind[i].buffer_length=l;
  118. _bind[i].is_null=_is_null+i;
  119. _bind[i].length=_length+i;
  120. ++i;
  121. #defineBIND_INT(x)
  122. _bind[i].buffer_type=MYSQL_TYPE_LONG;
  123. _bind[i].buffer=(char*)&(parent::x);
  124. _bind[i].buffer_length=0;
  125. _bind[i].is_null=_is_null+i;
  126. _bind[i].length=_length+i;
  127. ++i;
  128. #defineEND_BIND(h)}
  129. operatorMYSQL_BIND*(){
  130. return_bind;
  131. }
  132. };
  133. 利用办法;
  134. 比方想查询的内容具有以下布局
  135. structaccount{
  136. charuser[36];
  137. bytepassword[16];
  138. uint32_tstatus;
  139. uint32_tid;
  140. };
  141. //声明查询bind布局account,参数4个
  142. DECL_BIND(account,4)
  143. BIND_BIN(user,32)
  144. BIND_BIN(password,16)
  145. BIND_INT(status)
  146. BIND_INT(id)
  147. END_BIND(account)
  148. intmain(){
  149. try{
  150. DBMysqlmysql;
  151. mysql_parmparm;
  152. parm.host="localhost";
  153. parm.user="root";
  154. parm.password="test";
  155. parm.unixsock="/var/lib/mysql/mysql.sock";
  156. parm.database="testdb";
  157. mysql.open(parm);//翻开数据库
  158. DBSTMTsmt("selectuser,password,status,idfromaccount",mysql);//天生一个查询语法
  159. DBSTMTsmt1("insertintoaccount(user,password,status)value(?,?,?)",mysql);//别的一个
  160. //
  161. bind_accountacc;
  162. smt.execute(acc);//实行查询,并bind前往了局到account布局
  163. while(smt.fetch()){
  164. printf("%s%d%d
  165. ",acc.user,acc.status,acc.id);
  166. };
  167. smt1.bind(acc);//bind查询参数
  168. smt1.execute();//实行
  169. }catch(constchar*err){
  170. printf("error:%s
  171. ",err);
  172. }
  173. }
复制代码
你可以配置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操作(因为本来就是排序的嘛)。
因胸联盟 该用户已被删除
5#
 楼主| 发表于 2015-2-11 07:20:01 | 只看该作者
这一点很好的加强了profiler的功能。但是提到profiler提醒大家注意一点。windows2003要安装sp1补丁才能启动profiler。否则点击没有反应。
不帅 该用户已被删除
6#
发表于 2015-3-2 00:06:54 | 只看该作者
groupby子句可以将查询结果分组,并返回行的汇总信息Oracle按照groupby子句中指定的表达式的值分组查询结果。
爱飞 该用户已被删除
7#
发表于 2015-3-11 01:28:43 | 只看该作者
having子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having条件显示特定的组,也可以使用多个分组标准进行分组。
飘灵儿 该用户已被删除
8#
发表于 2015-3-17 18:11:36 | 只看该作者
是否碎片会引发效率问题?这都是需要进一步探讨的东西。varbinary(max)代替image也让SQLServer的字段类型更加简洁统一。
透明 该用户已被删除
9#
发表于 2015-3-24 20:46:50 | 只看该作者
我是新手,正在学习数据库和操作系统,深感理论的泛广,唯有一步一步来,但是又感觉时间不够,收集了很多资料却总是没能认真的看完,希望有一个讨论板块,大家共同解决,共同分享,共同努力
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-29 06:47

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表