MySQL Connector/C++ 接口实例

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:
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
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
存储 SQL 关系型数据库
创建并配置RDS实例
在阿里云上创建RDS实例涉及登录控制台、进入RDS管理页面、创建实例、选择数据库引擎和版本、配置实例规格与存储、设定网络与安全组、设置实例信息、确认订单并支付,最后初始化数据库。操作步骤可能因界面更新或数据库引擎不同略有差异。
19 1
|
1月前
|
算法 编译器 C语言
C++-带你深度理解string类的常见接口
C++-带你深度理解string类的常见接口
30 0
|
2天前
|
关系型数据库 MySQL 数据库
一台MySQL数据库启动多个实例
一台MySQL数据库启动多个实例
|
9天前
|
缓存 编译器 API
NumPy与其他语言(如C/C++)的接口实践
【4月更文挑战第17天】本文介绍了NumPy与C/C++的接口实践,包括Python与C/C++交互基础、NumPy的C API和Cython的使用。通过案例展示了如何将C++函数与NumPy数组结合,强调了内存管理、类型匹配、错误处理和性能优化的最佳实践。掌握这些技能对于跨语言交互和集成至关重要。
|
30天前
|
监控 Linux 编译器
Linux C++ 定时器任务接口深度解析: 从理论到实践
Linux C++ 定时器任务接口深度解析: 从理论到实践
70 2
|
30天前
|
存储 移动开发 安全
【C/C++ 口语】C++ 编程常见接口发音一览(不断更新)
【C/C++ 口语】C++ 编程常见接口发音一览(不断更新)
22 0
|
1月前
Mybatis+mysql动态分页查询数据案例——房屋信息的接口(IHouseDao)
Mybatis+mysql动态分页查询数据案例——房屋信息的接口(IHouseDao)
12 1
|
1月前
|
NoSQL 关系型数据库 MySQL
Docker安装详细步骤及相关环境安装配置(mysql、jdk、redis、自己的私有仓库Gitlab 、C和C++环境以及Nginx服务代理)
Docker安装详细步骤及相关环境安装配置(mysql、jdk、redis、自己的私有仓库Gitlab 、C和C++环境以及Nginx服务代理)
216 0
|
设计模式 XML C++
C++组合模式探索:以统一接口管理复杂的层次结构
C++组合模式探索:以统一接口管理复杂的层次结构
34 1
|
1月前
|
关系型数据库 MySQL 数据库
初始化RDS实例
初始化RDS实例
15 3