国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

數據庫MySql類庫系列(七)-PrepareOperatorSelect

2019-11-06 06:12:38
字體:
來源:轉載
供稿:網友

第六個工具類:PRepareOperatorSelect

負責處理:預處理執行sql方式下的,查找,以及獲取查找結果的需求。

用到了之前的DBOperator。

提供主要的接口:

1、BindSql:預處理帶占位符的sql語句

2、BindParameter,BindResult:綁定sql語句中占位符對應的參數,

BindParameter用于綁定查詢參數

BindResult用于綁定查詢結果

這里使用了不定參數的方式,支持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);

那么假設有3個字段:帳號名(字符串),賬號密碼(字符串),賬號id(無符號整數)

則:

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,得到結果

4、FetchResult:得到結果之后,獲取一條結果數據。多于有多行結果的,則前一條結果處理完之后,再調用則獲取下一行結果

5、FreeResult:所有結果全部處理完之后,釋放結果集(如果不釋放,在下次執行查詢之前,會強制釋放,對象析構時,會強制釋放)。

代碼:

PrepareOperatorSelect.h:

#ifndef __PrepareOperatorSelect_H__#define	__PrepareOperatorSelect_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 PrepareOperatorSelect		{		public:			PrepareOperatorSelect();			~PrepareOperatorSelect();			void Release();			// 設置sql			bool BindSql(MYSQL *connect, const char *sql);			bool BindParameter(const char *format, ...);			bool BindResult(const char *format, ...);			// 執行sql			bool DoOperator();			// 獲取一條結果			bool FetchResult();			// 釋放結果			bool FreeResult();		private:			MYSQL_STMT *m_Stmt;			// 預處理對象			MYSQL_BIND *m_Parameter;	// 綁定的查詢參數			MYSQL_BIND *m_Result;		// 綁定的查詢結果			MYSQL_RES *m_Data;			// 結果集數據		};	}}#endifPrepareOperatorSelect.cpp:

#include "PrepareOperatorSelect.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{		PrepareOperatorSelect::PrepareOperatorSelect()		{			m_Stmt = NULL;			m_Parameter = NULL;			m_Result = NULL;			m_Data = NULL;		}		PrepareOperatorSelect::~PrepareOperatorSelect()		{			Release();		}		void PrepareOperatorSelect::Release()		{			if (NULL != m_Data)			{				DBOperator::FreeResult(m_Data);				m_Data = NULL;			}			if (NULL != m_Stmt)			{				DBOperator::FreeStmt(m_Stmt);				m_Stmt = NULL;			}			if (NULL != m_Parameter)			{				delete[] m_Parameter;				m_Parameter = NULL;			}			if (NULL != m_Result)			{				delete[] m_Result;				m_Result = NULL;			}		}		bool PrepareOperatorSelect::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 PrepareOperatorSelect::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 PrepareOperatorSelect::BindResult(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_Result)				{					delete[] m_Result;					m_Result = NULL;				}				m_Result = new MYSQL_BIND[argc];				if (NULL != m_Result)				{					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_Result[curr_arg], buff);								curr_arg++;							}							break;							case 'u':							{								unsigned int *buff = va_arg(argptr, unsigned int *);								DBOperator::BindUInt(m_Stmt, &m_Result[curr_arg], buff);								curr_arg++;							}							break;							case 'I':							{								long long *buff = va_arg(argptr, long long *);								DBOperator::BindInt64(m_Stmt, &m_Result[curr_arg], buff);								curr_arg++;							}							break;							case 'U':							{								unsigned long long *buff = va_arg(argptr, unsigned long long *);								DBOperator::BindUInt64(m_Stmt, &m_Result[curr_arg], buff);								curr_arg++;							}							break;							case 'f':							{								float *buff = va_arg(argptr, float *);								DBOperator::BindFloat(m_Stmt, &m_Result[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_Result[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_Result[curr_arg], buff, bufflen);								curr_arg++;							}							break;							default:							break;						}					}					va_end(argptr);					return DBOperator::BindResultStmt(m_Stmt, m_Result);				}				else				{					return false;				}			}			else			{				return false;			}		}		bool PrepareOperatorSelect::DoOperator()		{			if (NULL != m_Stmt)			{				if (NULL != m_Data)				{					DBOperator::FreeResult(m_Data);					m_Data = NULL;				}				if (DBOperator::ExecStmt(m_Stmt))				{					m_Data = DBOperator::SelectResult(m_Stmt);					if (NULL != m_Data)					{						return true;					}					else					{						return false;					}				}				else				{					return false;				}			}			else			{				return false;			}		}		bool PrepareOperatorSelect::FetchResult()		{			if (NULL != m_Stmt)			{				if (NULL != m_Data)				{					if (DBOperator::GetNextResult(m_Stmt))					{						return true;					}					else					{						DBOperator::FreeResult(m_Data);						m_Data = NULL;						return false;					}				}				else				{					return false;				}			}			else			{				return false;			}		}		bool PrepareOperatorSelect::FreeResult()		{			if (NULL != m_Stmt)			{				if (NULL != m_Data)				{					DBOperator::FreeResult(m_Data);					m_Data = NULL;					return true;				}				else				{					return false;				}			}			else			{				return false;			}		}	}}


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 任丘市| 桃园市| 汝阳县| 抚远县| 会东县| 富顺县| 曲靖市| 界首市| 乐东| 孝感市| 安平县| 泾阳县| 石屏县| 那曲县| 山阴县| 友谊县| 内乡县| 东兰县| 板桥市| 特克斯县| 镇江市| 沙雅县| 仁化县| 南郑县| 大英县| 南川市| 定州市| 钟山县| 平阳县| 邳州市| 资源县| 益阳市| 定边县| 遂昌县| 韩城市| 景宁| 苍溪县| 汕头市| 连云港市| 巴里| 沅江市|