C++封装SQLite实例<三>
前一篇博客中介绍的是如何根据sqlite3_get_table()函数来获取一张表的内容,就是一股脑的把表中的内容全部存储起来放在一个一维数组中,这当中的规则已经介绍过了。接下来讲的是如何根据一个SQL查询语句来挑选出合乎选择条件的记录,被挑选出的记录事先是不知道的。你不知道这个查询的结果中有几行更不知道每一行中具体的记录值是什么,所以没办法用给定行值和列值的方式来获取数据,所有之前的用数组存储表的方式就行不通了。想要灵活的管理一个查询返回的结果这就会复杂多了,用到的SQLite原生函数也很多。
这个CppSQLite3Query类中有四个字段,分别是
CppSQLite3Query::CppSQLite3Query(){mpDB = 0;mpStmt = 0;mnCols = 0;mbEof = true;}CppSQLite3Query::CppSQLite3Query(sqlite3 *pdb, sqlite3_stmt *pStmt, bool bEof){mpDB = pdb;mpStmt = pStmt;mbEof = bEof;mnCols = sqlite3_column_count(pStmt);}CppSQLite3Query::CppSQLite3Query(const CppSQLite3Query &rQuery){mpStmt = rQuery.mpStmt;const_cast<CppSQLite3Query &>(rQuery).mpStmt = 0;mnCols = rQuery.mnCols;mbEof = rQuery.mbEof;}CppSQLite3Query& CppSQLite3Query::operator =(const CppSQLite3Query &rQuery){mpStmt = rQuery.mpStmt;const_cast<CppSQLite3Query &>(rQuery).mpStmt = 0;mnCols = rQuery.mnCols;mbEof = rQuery.mbEof;return *this;}CppSQLite3Query::~CppSQLite3Query(){Finalize();}void CppSQLite3Query::CheckStmt(){if (mpStmt == 0){throw CppSQLite3Exception(CPPSQLITE_ERROR,"Invalid Stmt Pointer",DONT_DELETE_MSG);}}int CppSQLite3Query::FieldNums(){CheckStmt();return mnCols;}//根据字段名返回列索引int CppSQLite3Query::FieldIndex(const char* szField){CheckStmt();if (szField){for (int nField = 0; nField < mnCols; nField++){//后面还有很多类似的函数,参数差不多,需要一个sqlite3_stmt*和列索引值,这应该是内部查询了之后返回的结果,而不是事先保存的const char *szTemp = sqlite3_column_name(mpStmt, nField);if (strcmp(szTemp, szField) == 0){return nField;}}}throw CppSQLite3Exception(CPPSQLITE_ERROR,"Invalid field name requested",DONT_DELETE_MSG);}const char* CppSQLite3Query::FieldName(int nField){CheckStmt();if (nField < 0 || nField > mnCols-1){throw CppSQLite3Exception(CPPSQLITE_ERROR,"Invalid field index requested",DONT_DELETE_MSG);}return sqlite3_column_name(mpStmt, nField);}int CppSQLite3Query::FieldDataType(int nField){CheckStmt();if (nField < 0 || nField > mnCols-1){throw CppSQLite3Exception(CPPSQLITE_ERROR,"Invalid field index requested",DONT_DELETE_MSG);}return sqlite3_column_type(mpStmt, nField);}const char* CppSQLite3Query::FieldDeclType(int nField){CheckStmt();if (nField < 0 || nField > mnCols-1){throw CppSQLite3Exception(CPPSQLITE_ERROR,"Invalid field index requested",DONT_DELETE_MSG);}return sqlite3_column_decltype(mpStmt, nField);}const char* CppSQLite3Query::FieldValue(int nField){CheckStmt();if (nField < 0 || nField > mnCols-1){throw CppSQLite3Exception(CPPSQLITE_ERROR,"Invalid field index requested",DONT_DELETE_MSG);}return (const char*)sqlite3_column_text(mpStmt, nField);}const char* CppSQLite3Query::FieldValue(const char *szField){int nField = FieldIndex(szField);return FieldValue(nField);}bool CppSQLite3Query::FieldIsNull(int nField){return (FieldDataType(nField) == SQLITE_NULL);}bool CppSQLite3Query::FieldIsNull(const char *szField){int nField = FieldIndex(szField);return (FieldDataType(nField) == SQLITE_NULL);}bool CppSQLite3Query::GetIntValue(int nField, int &rDest){if (FieldDataType(nField) == SQLITE_NULL){return false;}else{rDest = sqlite3_column_int(mpStmt, nField);return true;}}bool CppSQLite3Query::GetIntValue(const char *szField, int &rDest){int nField = FieldIndex(szField);return GetIntValue(nField, rDest);}bool CppSQLite3Query::GetFloatValue(int nField, double &rDest){if (FieldDataType(nField) == SQLITE_NULL){return false;}else{rDest = sqlite3_column_double(mpStmt, nField);return true;}}bool CppSQLite3Query::GetFloatValue(const char *szField, double &rDest){int nField = FieldIndex(szField);return GetFloatValue(nField, rDest);}bool CppSQLite3Query::GetStringValue(int nField, char *&rDest){if (FieldDataType(nField) == SQLITE_NULL){return false;}else{rDest = const_cast<char *>((const char*)sqlite3_column_text(mpStmt, nField));return true;}}bool CppSQLite3Query::GetStringValue(const char *szField, char *&rDest){int nField = FieldIndex(szField);return GetStringValue(nField, rDest);}bool CppSQLite3Query::Eof(){CheckStmt();return mbEof;}void CppSQLite3Query::NextRow(){CheckStmt();int nRet = sqlite3_step(mpStmt);if (nRet == SQLITE_DONE){// no rowsmbEof = true;}else if (nRet == SQLITE_ROW){// more rows, nothing to do}else{nRet = sqlite3_finalize(mpStmt);mpStmt = 0;const char* szError = sqlite3_errmsg(mpDB);throw CppSQLite3Exception(nRet, szError, DONT_DELETE_MSG);}}void CppSQLite3Query::Finalize(){if (mpStmt){int nRet = sqlite3_finalize(mpStmt);mpStmt = 0;if (nRet != SQLITE_OK){const char* szError = sqlite3_errmsg(mpDB);throw CppSQLite3Exception(nRet, szError, DONT_DELETE_MSG);}}}