第四個工具類,QueryOperatorSelect
負責處理:直接執行sql方式下的,查找,以及獲取查找結果的需求。
用到了之前的DBOperator,主要是封裝其ExecQuery接口。
另外提供獲取查詢結果的相應接口:
從結果集中取出一行數據:FetchResult。
取出一行數據之后,在這一行數據中,取每個字段的值:GetColumn。(由于本人的業務需要,目前僅提供支持7種數據類型:int,unsigned int,long long,unsigned long long,float,字符串,Blob)。
每一行數據都處理完之后,釋放結果集:FreeResult。(如果不釋放,在下次執行查詢之前,會強制釋放,對象析構時,會強制釋放)。
QueryOperatorSelect.h
#ifndef __QueryOperatorSelect_H__#define __QueryOperatorSelect_H__struct st_MySQL;typedef struct st_mysql MYSQL;struct st_mysql_res;typedef struct st_mysql_res MYSQL_RES;typedef char** MYSQL_ROW;namespace common{ namespace db{ class QueryOperatorSelect { public: QueryOperatorSelect(); ~QueryOperatorSelect(); void Release(); // 執行sql bool DoOperator(MYSQL *connect, const char *sql); // 獲取一條結果 bool FetchResult(); // 獲取一條結果一列的值 bool GetColumn(int& value, unsigned int index); bool GetColumn(unsigned int& value, unsigned int index); bool GetColumn(long long& value, unsigned int index); bool GetColumn(unsigned long long& value, unsigned int index); bool GetColumn(float& value, unsigned int index); bool GetColumn(void* value, unsigned int index); // 釋放結果 bool FreeResult(); PRivate: MYSQL_RES *m_Data; // 結果集數據 unsigned int m_FieldCount; // 結果集列數 MYSQL_ROW m_Columns; // 數據每一列的值 unsigned long *m_ColumnLens; // 數據每一列的長度 }; }}#endifQueryOperatorSelect.cpp#include "QueryOperatorSelect.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{ QueryOperatorSelect::QueryOperatorSelect() { m_Data = NULL; m_FieldCount = 0; m_Columns = NULL; m_ColumnLens = NULL; } QueryOperatorSelect::~QueryOperatorSelect() { Release(); } void QueryOperatorSelect::Release() { if (NULL != m_Data) { DBOperator::FreeResult(m_Data); m_Data = NULL; } if (NULL != m_Columns) { m_Columns = NULL; } } bool QueryOperatorSelect::DoOperator(MYSQL *connect, const char *sql) { if (NULL != connect && NULL != sql) { if (NULL != m_Data) { DBOperator::FreeResult(m_Data); m_Data = NULL; } if (DBOperator::ExecQuery(connect, sql)) { m_Data = DBOperator::SelectResult(connect); if (NULL != m_Data) { m_FieldCount = DBOperator::GetResultFields(m_Data); return true; } else { m_FieldCount = 0; return false; } } else { return false; } } else { return false; } } bool QueryOperatorSelect::FetchResult() { if (NULL != m_Data) { m_Columns = DBOperator::GetNextResult(m_Data); m_ColumnLens = DBOperator::GetResultLens(m_Data); if (NULL != m_Columns && NULL != m_ColumnLens) { return true; } else { DBOperator::FreeResult(m_Data); m_Data = NULL; m_ColumnLens = NULL; return false; } } else { return false; } } bool QueryOperatorSelect::GetColumn(int& value, unsigned int index) { if (NULL != m_Columns && index < m_FieldCount) { sscanf(m_Columns[index], "%d", &value); return true; } else { return false; } } bool QueryOperatorSelect::GetColumn(unsigned int& value, unsigned int index) { if (NULL != m_Columns && index < m_FieldCount) { sscanf(m_Columns[index], "%u", &value); return true; } else { return false; } } bool QueryOperatorSelect::GetColumn(long long& value, unsigned int index) { if (NULL != m_Columns && index < m_FieldCount) { sscanf(m_Columns[index], "%lld", &value); return true; } else { return false; } } bool QueryOperatorSelect::GetColumn(unsigned long long& value, unsigned int index) { if (NULL != m_Columns && index < m_FieldCount) { sscanf(m_Columns[index], "%llu", &value); return true; } else { return false; } } bool QueryOperatorSelect::GetColumn(float& value, unsigned int index) { if (NULL != m_Columns && index < m_FieldCount) { sscanf(m_Columns[index], "%f", &value); return true; } else { return false; } } bool QueryOperatorSelect::GetColumn(void* value, unsigned int index) { if (NULL != m_Columns && NULL != m_ColumnLens && index < m_FieldCount) { memcpy(value, m_Columns[index], m_ColumnLens[index]); return true; } else { return false; } } bool QueryOperatorSelect::FreeResult() { if (NULL != m_Data) { DBOperator::FreeResult(m_Data); m_Data = NULL; return true; } else { return false; } } }}
新聞熱點
疑難解答