数据库MySql类库系列(六)-PrepareOperatorUpdate
2017-03-07 11:41
253 查看
第五个工具类,PrepareOperatorUpdate
负责处理:预处理执行sql方式下的,增、删、改的需求。
用到了之前的DBOperator。
提供主要的接口:
1、BindSql:预处理带占位符的sql语句
2、BindParameter:绑定sql语句中占位符对应的参数,这里使用了不定参数的方式,支持7种格式控制符:
那么假设有3个字段:帐号名(字符串),账号密码(字符串),账号id(无符号整数)
则:
3、DoOperator:给sql语句对应的绑定参数赋值之后,执行sql,得到结果
代码:
PrepareOperatorUpdate.h:
PrepareOperatorUpdate.cpp:
负责处理:预处理执行sql方式下的,增、删、改的需求。
用到了之前的DBOperator。
提供主要的接口:
1、BindSql:预处理带占位符的sql语句
2、BindParameter:绑定sql语句中占位符对应的参数,这里使用了不定参数的方式,支持7种格式控制符:
int | %i | int value; BindParameter("%i", &value); |
unsigned int | %u | unsigned int value; BindParameter("%u", &value); |
long long | %I(大写i) | long long value; BindParameter("%I", &value); |
unsigned long long | %U | unsigned long long value; BindParameter("%U", &value); |
float | %f | float value; BindParameter("%f", &value); |
char * | %s | char value[10]; unsigned long valueLen = sizeof(value); BindParameter("%s", value, &valueLen); |
void * | %B | typedef struct _XXX { //... }XXX; XXX value; unsigned long valueLen = sizeof(value); BindParameter("%B", &value, &valueLen); |
则:
char accountName[20]; unsigned long accountNameLen = sizeof(accountName); char accountKey[20]; unsigned long accountKeyLen = sizeof(accountKey); unsigned int accountId; BindParameter("%s,%s,%u", accountName, &accountNameLen, accountKey, &accountKeyLen, &accountId);
3、DoOperator:给sql语句对应的绑定参数赋值之后,执行sql,得到结果
代码:
PrepareOperatorUpdate.h:
#ifndef __PrepareOperatorUpdate_H__ #define __PrepareOperatorUpdate_H__ struct st_mysql; typedef struct st_mysql MYSQL; struct st_mysql_stmt; typedef struct st_mysql_stmt MYSQL_STMT; struct st_mysql_bind; typedef struct st_mysql_bind MYSQL_BIND; struct st_mysql_res; typedef struct st_mysql_res MYSQL_RES; namespace common{ namespace db{ class PrepareOperatorUpdate { public: PrepareOperatorUpdate(); ~PrepareOperatorUpdate(); void Release(); // 设置sql bool BindSql(MYSQL *connect, const char *sql); bool BindParameter(const char *format, ...); // 执行sql bool DoOperator(); private: MYSQL_STMT *m_Stmt; // 预处理对象 MYSQL_BIND *m_Parameter; // 绑定的更新参数 }; } } #endif
PrepareOperatorUpdate.cpp:
#include "PrepareOperatorUpdate.h" #ifdef WIN32 #include <winsock2.h> #endif #include <stdio.h> #include <mysql.h> #include <string.h> #include <stdarg.h> #include "DBOperator.h" namespace common{ namespace db{ PrepareOperatorUpdate::PrepareOperatorUpdate() { m_Stmt = NULL; m_Parameter = NULL; } PrepareOperatorUpdate::~PrepareOperatorUpdate() { Release(); } void PrepareOperatorUpdate::Release() { if (NULL != m_Stmt) { DBOperator::FreeStmt(m_Stmt); m_Stmt = NULL; } if (NULL != m_Parameter) { delete[] m_Parameter; m_Parameter = NULL; } } bool PrepareOperatorUpdate::BindSql(MYSQL *connect, const char *sql) { Release(); if (NULL != connect) { m_Stmt = DBOperator::ExecPrepare(connect, sql); if (NULL != m_Stmt) { return true; } else { return false; } } else { return false; } } bool PrepareOperatorUpdate::BindParameter(const char *format, ...) { if (NULL != m_Stmt) { size_t len = strlen(format); unsigned int argc = 0; for (size_t i = 0; i < len; i++) { switch (format[i]) { case 'i': case 'u': case 'I': case 'U': case 'f': case 's': case 'B': argc++; break; default: break; } } if (NULL != m_Parameter) { delete[] m_Parameter; m_Parameter = NULL; } m_Parameter = new MYSQL_BIND[argc]; if (NULL != m_Parameter) { va_list argptr; va_start(argptr, format); int curr_arg = 0; for (size_t i = 0; i < len; i++) { switch (format[i]) { case 'i': { int *buff = va_arg(argptr, int *); DBOperator::BindInt(m_Stmt, &m_Parameter[curr_arg], buff); curr_arg++; } break; case 'u': { unsigned int *buff = va_arg(argptr, unsigned int *); DBOperator::BindUInt(m_Stmt, &m_Parameter[curr_arg], buff); curr_arg++; } break; case 'I': { long long *buff = va_arg(argptr, long long *); DBOperator::BindInt64(m_Stmt, &m_Parameter[curr_arg], buff); curr_arg++; } break; case 'U': { unsigned long long *buff = va_arg(argptr, unsigned long long *); DBOperator::BindUInt64(m_Stmt, &m_Parameter[curr_arg], buff); curr_arg++; } break; case 'f': { float *buff = va_arg(argptr, float *); DBOperator::BindFloat(m_Stmt, &m_Parameter[curr_arg], buff); curr_arg++; } break; case 's': { char *buff = va_arg(argptr, char *); unsigned long *bufflen = va_arg(argptr, unsigned long *); DBOperator::BindString(m_Stmt, &m_Parameter[curr_arg], buff, bufflen); curr_arg++; } break; case 'B': { void *buff = va_arg(argptr, void *); unsigned long *bufflen = va_arg(argptr, unsigned long *); DBOperator::BindBlob(m_Stmt, &m_Parameter[curr_arg], buff, bufflen); curr_arg++; } break; default: break; } } va_end(argptr); return DBOperator::BindParameterStmt(m_Stmt, m_Parameter); } else { return false; } } else { return false; } } bool PrepareOperatorUpdate::DoOperator() { if (NULL != m_Stmt) { return DBOperator::ExecStmt(m_Stmt); } else { return false; } } } }
相关文章推荐
- 数据库MySql类库系列(三)-QueryOperatorUpdate
- 数据库MySql类库系列(七)-PrepareOperatorSelect
- 数据库MySql类库系列(二)-DBService
- 数据库MySql类库系列(一)-DBOperator
- 数据库MySql类库系列(九)-DBServicePool
- 数据库MySql类库系列(八)-预处理执行Sql方式的示例
- 数据库操作通用类库 不管是sql server oracle mysql 还有别的都可以啊! 太强了
- MySQL 数据库性能优化之索引优化(这是 MySQL数据库性能优化专题 系列的第三篇文章)
- Update语句更新多表时在SQL Server,Oracle,MySQL三种数据库中的用法
- MySQL笔记系列:数据库概述
- 渣渣小本求职复习之路每天一博客系列——数据库基础(MySQL)(4)
- 渣渣小本求职复习之路每天一博客系列——数据库基础(MySQL)(5)
- MySql系列:中文写入数据库出现错误java.sql.SQLException: Incorrect string value: '\xE5\xxxx' for column 'xxxx' at row 1及其解决方法
- 【十分钟系列课程】第二集~MySQL客户端安装及创建数据库
- 数据库基础系列之一:MySQL账户
- 服务器数据库系列 - MySQL 加锁处理分析
- Delphi XE3 数据库系列(一):使用dbexpress访问mysql
- Mysql入门系列:一个MYSQL样例数据库
- MySQL 数据库性能优化之SQL优化(这是 MySQL数据库性能优化专题 系列的第四篇文章)
- 数据库mysql存储过程Insert、update