MySQL Connector/C++ 接口实例

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介:
mysql的官方网站有对MySQL Connector/C++的文档解释和具体实例,但是大家也知道,如果把那些具体实例的代码只是生硬的套入项目工程中是万万不行的,因为项目安全性要求,需要对容错,资源创建释放问题严格关注,下面贴一个自己的方法函数,里面涵盖了相关安全处理而且对调用存储过程也有所涉及:
 

 

 
  1. bool CommonService::......(JSONNode& in, JSONNode& out) 
  2. {    
  3.     /*=====校验json传入参数=====*/ 
  4. ..........
  5.  
  6.     /*=====解析json传入参数,得到安装码或者id, 安装时间, 硬盘序列号, ip,mac=====*/ 
  7.  
  8.    ..........
  9.  
  10.     /*=====通过安装码找到数据库中的对应记录写入传入的值=====*/ 
  11.     /********数据库操作**********/ 
  12.     //1.得到数据库连接 
  13.     Connection* con = G<ConnectionPool>().GetConnection(); 
  14.     if (con == NULL) 
  15.     { 
  16.         LOG4CXX_ERROR(g_logger, "不能得到数据库连接"); 
  17.         out.push_back(JSONNode(RESULT, ACTION_FALSE)); 
  18.         out.push_back(JSONNode(ERROR_MESSAGE, "不能得到数据库连接")); 
  19.         return false
  20.     } 
  21.  
  22.     int ret = 1; 
  23.     PreparedStatement* prep_stmt = NULL; 
  24.     ResultSet*         res       = NULL; 
  25.  
  26.     try 
  27.     { 
  28.         con->setSchema(G<ConnectionPool>().GetDBName().c_str()); 
  29.  
  30.         //执行sql改变安装状态 
  31.         std::string sql_statement = "update tb_host set reg_date=?, sn=?, ip=?, mac=?, state=?, sync_state=? where reg_code =? and state=?";    //要执行的sql语句 
  32.         //事务处理 
  33.         con->setAutoCommit(0); 
  34.         prep_stmt = con->prepareStatement(sql_statement.c_str()); 
  35.  
  36.         prep_stmt->setString(1, install_time.c_str()); 
  37.         prep_stmt->setString(2, harddrive_sn.c_str()); 
  38.         prep_stmt->setString(3, ip_address.c_str()); 
  39.         prep_stmt->setString(4, mac_address.c_str()); 
  40.         prep_stmt->setInt(5, HAS_INSTALL); 
  41.         prep_stmt->setInt(6, HAS_SYNC); 
  42.         prep_stmt->setString(7, install_code.c_str()); 
  43.         prep_stmt->setInt(8, NO_INSTALL); 
  44.  
  45.         if(prep_stmt->executeUpdate() == 0) 
  46.         { 
  47.             ret = 2; 
  48.             LOG4CXX_INFO(g_logger, "....."); 
  49.             out.push_back(JSONNode(ERROR_MESSAGE, ".....")); 
  50.             goto Finally_handle; 
  51.         } 
  52.         //调用赋默认策略存储过程 
  53.         std::string procedure = "CALL updateHostPolicyByModHost(?,?, @ret, @msg)"
  54.         prep_stmt = con->prepareStatement(procedure.c_str()); 
  55.         prep_stmt->setString(1, install_code.c_str()); 
  56.         prep_stmt->setInt(2, 0); 
  57.         prep_stmt->execute(); 
  58.  
  59.         std::string query = "select @ret AS ret,@msg AS msg"
  60.         prep_stmt = con->prepareStatement(query.c_str()); 
  61.         res = prep_stmt->executeQuery(); 
  62.         while(res->next()) 
  63.         { 
  64.             if(res->getInt("ret") != 0) 
  65.             { 
  66.                 LOG4CXX_ERROR(g_logger, "....." << res->getString("msg").c_str() << res->getInt("ret")); 
  67.                 out.push_back(JSONNode(ERROR_MESSAGE, ".....")); 
  68.                 goto Finally_handle; 
  69.             } 
  70.         } 
  71.         con ->commit(); 
  72.  
  73.     } 
  74.     catch (SQLException& e) 
  75.     { 
  76.         try 
  77.         { 
  78.             con->rollback(); 
  79.         } 
  80.         catch (SQLException& e) 
  81.         { 
  82.             ret = 0; 
  83.             LOG4CXX_ERROR(g_logger, "数据库异常" << e.what()); 
  84.         } 
  85.  
  86.         ret = 0; 
  87.         LOG4CXX_ERROR(g_logger, "数据库异常" << e.what()); 
  88.         out.push_back(JSONNode(ERROR_MESSAGE, e.what()));  
  89.     } 
  90.     catch (...) 
  91.     { 
  92.         ret = 0; 
  93.         LOG4CXX_ERROR(g_logger, "其他错误"); 
  94.         out.push_back(JSONNode(ERROR_MESSAGE, "其他错误")); 
  95.     } 
  96.      
  97. Finally_handle: 
  98.     DestorySql(res, prep_stmt); 
  99.     //将连接释放到连接池 
  100.     G<ConnectionPool>().ReleaseConnection(con); 
  101.  
  102.     if (ret == 1) 
  103.     { 
  104.         out.push_back(JSONNode(RESULT, ACTION_SUCCESS)); 
  105.         return true
  106.     } 
  107.     else if (ret == 2) 
  108.     { 
  109.         out.push_back(JSONNode(RESULT, ACTION_FALSE)); 
  110.         return true
  111.     } 
  112.     else 
  113.     { 
  114.         out.push_back(JSONNode(RESULT, ACTION_FALSE)); 
  115.         return false
  116.     } 
  117.  
  118.  
 
  1. /************************************************************************/ 
  2. /* 销毁数据库记录集资源                                                 */ 
  3. /************************************************************************/ 
  4. void CommonService::DestorySql(ResultSet* res, PreparedStatement* prep_stmt) 
  5.     if (res != NULL) 
  6.     { 
  7.         try 
  8.         { 
  9.             res ->close(); 
  10.         } 
  11.         catch(SQLException& e) 
  12.         { 
  13.             LOG4CXX_ERROR(g_logger, "数据库异常" << e.what()); 
  14.         } 
  15.         delete res; 
  16.         res = NULL; 
  17.     } 
  18.     if (prep_stmt != NULL){ 
  19.         try 
  20.         { 
  21.             prep_stmt->close(); 
  22.         } 
  23.         catch(SQLException& e) 
  24.         { 
  25.             LOG4CXX_ERROR(g_logger, "数据库异常" << e.what()); 
  26.         } 
  27.         delete prep_stmt; 
  28.         prep_stmt = NULL; 
  29.     } 
 本文转自永远的朋友博客51CTO博客,原文链接http://blog.51cto.com/yaocoder/643004如需转载请自行联系原作者

yaocoder
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
19天前
|
存储 关系型数据库 MySQL
环比、环比增长率、同比、同比增长率 ,占比,Mysql 8.0 实例(最简单的方法之一)(sample database classicmodels _No.2 )
环比、环比增长率、同比、同比增长率 ,占比,Mysql 8.0 实例(最简单的方法之一)(sample database classicmodels _No.2 )
71 1
|
19天前
|
SQL 前端开发 关系型数据库
全表数据核对 ,行数据核对,列数据核对,Mysql 8.0 实例(sample database classicmodels _No.3 )
全表数据核对 ,行数据核对,列数据核对,Mysql 8.0 实例(sample database classicmodels _No.3 )
36 0
全表数据核对 ,行数据核对,列数据核对,Mysql 8.0 实例(sample database classicmodels _No.3 )
|
13天前
|
SQL JavaScript 关系型数据库
node博客小项目:接口开发、连接mysql数据库
【10月更文挑战第14天】node博客小项目:接口开发、连接mysql数据库
|
21天前
|
关系型数据库 MySQL Java
Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
这篇文章是关于如何使用Django框架配置MySQL数据库,创建模型实例,并自动或手动创建数据库表,以及对这些表进行操作的详细教程。
54 0
Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
|
1月前
|
C++
【C++】实现日期类相关接口(三)
【C++】实现日期类相关接口
|
1月前
|
C++
【C++】实现日期类相关接口(二)
【C++】实现日期类相关接口
|
1月前
|
C++
【C++】实现日期类相关接口(一)
【C++】实现日期类相关接口
|
18天前
|
存储 关系型数据库 MySQL
mysql 8.0 的 建表 和八种 建表引擎实例
mysql 8.0 的 建表 和八种 建表引擎实例
18 0
|
19天前
|
存储 关系型数据库 MySQL
Key_Value 形式 存储_5级省市城乡划分代码 (mysql 8.0 实例)
本文介绍了如何使用MySQL8.0数据库中的Key_Value形式存储全国统计用区划代码和城乡划分代码(5级),包括导入数据、通过数学函数提取省市区信息,以及查询5级行政区划的详细数据。
26 0
|
19天前
|
算法 关系型数据库 MySQL
复购率 mysql 实例(sample database classicmodels _No.1 )
复购率 mysql 实例(sample database classicmodels _No.1 )
24 0