亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++利用MySQL API連接和操作數據庫實例詳解

2020-01-26 14:18:16
字體:
來源:轉載
供稿:網友

1.C++連接和操作MySQL的方式

系列文章:

MySQL 設計和命令行模式下建立詳解

C++利用MySQL API連接和操作數據庫實例詳解

在Windows平臺,我們可以使用ADO、ODBC或者MySQL API進行連接和操作。ADO (ActiveX Data Objects,ActiveX數據對象)是Microsoft提出的一個用于存取數據源的COM組件。它提供了程序語言和統一數據訪問方式OLE DB的一個中間層,也就是Microsoft提出的應用程序接口(API)用以實現訪問關系或非關系數據庫中的數據。

ODBC(Open DataBase Connection)開放式系統互連,是一種數據庫訪問協議,提供了訪問數據庫的API接口。基于ODBC的應用程序,對數據庫操作不依賴于具體的DBMS,不直接與DBMS打交道,所有數據庫操作由對應DBMS的ODBC驅動程序完成,即:系統中不需要安裝DBMS系統,如SQL SERVER 2005,但必須有SQL SERVER 2005的ODBC驅動程序,然后在ODBC管理器中注冊數據源后,就可以在應用程序中通過ODBC API訪問該數據庫。ODBC數據庫訪問技術只適用于windows系統,因為需要在ODBC驅動程序管理器中進行數據源注冊,而只有windows才集成了ODBC驅動程序管理器(“控制面板/管理工具/數據源”)。

ADO具有跨系統平臺特性,它直接對DBMS數據庫進行操作,即系統中必須有DBMS,但不需要驅動程序,不需要注冊數據源,所以具有很好的可移植性。

那么,在Linux平臺如何連接和使用MSQL數據庫呢?我們同樣可以使用ADO、unixODBC或者MySQL API。這里不再贅述前兩者的用法,讀者可自行研究實踐,下文將詳細講解MySQL創建數據庫和C++利用MSQL API連接和操作數據庫。

2.MSQL數據庫的設計和建立

MySQL數據庫管理系統(DBMS)中,包含的MySQL中定義數據字段的類型對你數據庫的優化是非常重要的。MySQL支持多種類型,大致可以分為三類:數值、日期/時間和字符串(字符)類型。

本文以大學熟悉的學生選課管理系統中用到的數據庫為例,來實現對數據庫的訪問。本文數據庫的建立,是在Linux平臺使用msyql命令完成

主要有三張表:學生表,課程表和選課表。下面是數據表的詳細情況。

學生表:
這里寫圖片描述

課程表:
這里寫圖片描述

選課表:
這里寫圖片描述

3.MSQL數據庫的連接和操作

下面將講解利用MySQL API來編寫我們自己的用于訪問MySQL的中間件,也是我們自己的組件。我們的組件在應用程序和MySQL數據庫之間構成的層次結構如下圖所示:
這里寫圖片描述

下面就來設計和實現我們自己的C++訪問MySQL數據庫的組件。

3.1頭文件的設計

//mysqlhelper.h#ifndef __MYSQL_HELPER_H__#define __MYSQL_HELPER_H__#include <stdlib.h>#include <map>#include <vector>#include <string>using namespace std;#include <mysql.h>namespace mysqlhelper{/**********************@brief 數據庫異常類**********************/struct MysqlHelper_Exception //: public TC_Exception{ MysqlHelper_Exception(const string &sBuffer):errorInfo(sBuffer){}; //: TC_Exception(sBuffer){}; ~MysqlHelper_Exception() throw(){};  string errorInfo;};/************************ @brief 數據庫配置接口***********************/struct DBConf{ string _host;//主機地址 string _user; //用戶名  string _password;//密碼 string _database; //數據庫 string _charset; //字符集 int _port;//端口 int _flag; //客戶端標識 /***************** * @brief 構造函數 *****************/ DBConf():_port(0), _flag(0){} /********************************** * @brief 讀取數據庫配置.  * @param mpParam 存放數據庫配置的map  * dbhost: 主機地址 * dbuser:用戶名 * dbpass:密碼 * dbname:數據庫名稱 * dbport:端口 **********************************/ void loadFromMap(const map<string, string> &mpParam) { map<string, string> mpTmp = mpParam; _host = mpTmp["dbhost"]; _user = mpTmp["dbuser"]; _password = mpTmp["dbpass"]; _database = mpTmp["dbname"]; _charset = mpTmp["charset"]; _port = atoi(mpTmp["dbport"].c_str()); _flag = 0; if(mpTmp["dbport"] == "") { _port = 3306; } }};/*************************************************************** @brief:MySQL數據庫操作類 * @feature:非線程安全,通常一個線程一個MysqlHelper對象;* 對于insert/update可以有更好的函數封裝,保證SQL注入;* MysqlHelper::DB_INT表示組裝sql語句時,不加””和轉義;* MysqlHelper::DB_STR表示組裝sql語句時,加””并轉義;**************************************************************/class MysqlHelper{public: /** * @brief 構造函數 */ MysqlHelper(); /** * @brief 構造函數.  * @param: sHost:主機IP * @param sUser 用戶 * @param sPasswd 密碼 * @param sDatebase 數據庫 * @param port 端口 * @param iUnixSocket socket * @param iFlag 客戶端標識 */ MysqlHelper(const string& sHost, const string& sUser = "", const string& sPasswd = "", const string& sDatabase = "", const string &sCharSet = "", int port = 0, int iFlag = 0); /** * @brief 構造函數.  * @param tcDBConf 數據庫配置 */ MysqlHelper(const DBConf& tcDBConf); /** * @brief 析構函數. */ ~MysqlHelper(); /** * @brief 初始化.  *  * @param sHost 主機IP * @param sUser 用戶 * @param sPasswd 密碼 * @param sDatebase 數據庫 * @param port 端口 * @param iUnixSocket socket * @param iFlag 客戶端標識 * @return 無 */ void init(const string& sHost, const string& sUser = "", const string& sPasswd = "", const string& sDatabase = "", const string &sCharSet = "", int port = 0, int iFlag = 0); /** * @brief 初始化.  *  * @param tcDBConf 數據庫配置 */ void init(const DBConf& tcDBConf); /** * @brief 連接數據庫.  *  * @throws MysqlHelper_Exception * @return 無 */ void connect(); /** * @brief 斷開數據庫連接.  * @return 無 */ void disconnect(); /** * @brief 獲取數據庫變量.  * @return 數據庫變量 */ string getVariables(const string &sName); /** * @brief 直接獲取數據庫指針.  *  * @return MYSQL* 數據庫指針 */ MYSQL *getMysql(); /** * @brief 字符轉義.  *  * @param sFrom 源字符串 * @param sTo 輸出字符串 * @return 輸出字符串 */ string escapeString(const string& sFrom); /** * @brief 更新或者插入數據.  *  * @param sSql sql語句 * @throws MysqlHelper_Exception * @return */ void execute(const string& sSql); /** * @brief mysql的一條記錄 */ class MysqlRecord { public: /** * @brief 構造函數. *  * @param record */ MysqlRecord(const map<string, string> &record); /** * @brief 獲取數據,s一般是指數據表的某個字段名  * @param s 要獲取的字段 * @return 符合查詢條件的記錄的s字段名 */ const string& operator[](const string &s); protected: const map<string, string> &_record; }; /** * @brief 查詢出來的mysql數據 */ class MysqlData { public: /** * @brief 所有數據. *  * @return vector<map<string,string>>& */ vector<map<string, string> >& data(); /** * 數據的記錄條數 *  * @return size_t */ size_t size(); /** * @brief 獲取某一條記錄.  *  * @param i 要獲取第幾條記錄  * @return MysqlRecord類型的數據,可以根據字段獲取相關信息, */ MysqlRecord operator[](size_t i); protected: vector<map<string, string> > _data; }; /** * @brief Query Record.  *  * @param sSql sql語句 * @throws MysqlHelper_Exception * @return MysqlData類型的數據,可以根據字段獲取相關信息 */ MysqlData queryRecord(const string& sSql); /** * @brief 定義字段類型,  * DB_INT:數字類型  * DB_STR:字符串類型 */ enum FT { DB_INT,  DB_STR,  }; /** * 數據記錄 */ typedef map<string, pair<FT, string> > RECORD_DATA; /** * @brief 更新記錄.  *  * @param sTableName 表名 * @param mpColumns 列名/值對 * @param sCondition where子語句,例如:where A = B * @throws MysqlHelper_Exception * @return size_t 影響的行數 */ size_t updateRecord(const string &sTableName, const map<string, pair<FT, string> > &mpColumns, const string &sCondition); /** * @brief 插入記錄.  *  * @param sTableName 表名 * @param mpColumns 列名/值對 * @throws MysqlHelper_Exception * @return size_t 影響的行數 */ size_t insertRecord(const string &sTableName, const map<string, pair<FT, string> > &mpColumns); /** * @brief 替換記錄.  *  * @param sTableName 表名 * @param mpColumns 列名/值對 * @throws MysqlHelper_Exception * @return size_t 影響的行數 */ size_t replaceRecord(const string &sTableName, const map<string, pair<FT, string> > &mpColumns); /** * @brief 刪除記錄.  *  * @param sTableName 表名 * @param sCondition where子語句,例如:where A = B * @throws MysqlHelper_Exception * @return size_t 影響的行數 */ size_t deleteRecord(const string &sTableName, const string &sCondition = ""); /** * @brief 獲取Table查詢結果的數目.  *  * @param sTableName 用于查詢的表名 * @param sCondition where子語句,例如:where A = B * @throws MysqlHelper_Exception * @return size_t 查詢的記錄數目 */ size_t getRecordCount(const string& sTableName, const string &sCondition = ""); /** * @brief 獲取Sql返回結果集的個數.  *  * @param sCondition where子語句,例如:where A = B * @throws MysqlHelper_Exception * @return 查詢的記錄數目 */ size_t getSqlCount(const string &sCondition = ""); /** * @brief 存在記錄.  *  * @param sql sql語句 * @throws MysqlHelper_Exception * @return 操作是否成功 */ bool existRecord(const string& sql); /** * @brief 獲取字段最大值.  *  * @param sTableName 用于查詢的表名 * @param sFieldName 用于查詢的字段 * @param sCondition where子語句,例如:where A = B * @throws MysqlHelper_Exception * @return 查詢的記錄數目 */ int getMaxValue(const string& sTableName, const string& sFieldName, const string &sCondition = ""); /** * @brief 獲取auto_increment最后插入得ID.  *  * @return ID值 */ long lastInsertID(); /** * @brief 構造Insert-SQL語句.  *  * @param sTableName 表名 * @param mpColumns 列名/值對 * @return string insert-SQL語句 */ string buildInsertSQL(const string &sTableName, const map<string, pair<FT, string> > &mpColumns); /** * @brief 構造Replace-SQL語句.  *  * @param sTableName 表名 * @param mpColumns 列名/值對 * @return string insert-SQL語句 */ string buildReplaceSQL(const string &sTableName, const map<string, pair<FT, string> > &mpColumns); /** * @brief 構造Update-SQL語句.  *  * @param sTableName 表名 * @param mpColumns 列名/值對 * @param sCondition where子語句 * @return string Update-SQL語句 */ string buildUpdateSQL(const string &sTableName,const map<string, pair<FT, string> > &mpColumns, const string &sCondition); /** * @brief 獲取最后執行的SQL語句. *  * @return SQL語句 */ string getLastSQL() { return _sLastSql; } /** * @brief 獲取查詢影響數 * @return int */ size_t getAffectedRows();protected: /** * @brief copy contructor,只申明,不定義,保證不被使用  */ MysqlHelper(const MysqlHelper &tcMysql); /** *  * @brief 只申明,不定義,保證不被使用 */ MysqlHelper &operator=(const MysqlHelper &tcMysql);private: /** * 數據庫指針 */ MYSQL *_pstMql; /** * 數據庫配置 */ DBConf _dbConf; /** * 是否已經連接 */ bool _bConnected; /** * 最后執行的sql */ string _sLastSql;};}#endif //__MYSQL_HELPER_H__

3.2源文件具體實現

//mysqlhelper.cpp#include "mysqlHelper.h"#include <string.h>#include <sstream>using namespace std;namespace mysqlhelper{MysqlHelper::MysqlHelper():_bConnected(false){ _pstMql = mysql_init(NULL);}MysqlHelper::MysqlHelper(const string& sHost, const string& sUser, const string& sPasswd, const string& sDatabase, const string &sCharSet, int port, int iFlag):_bConnected(false){ init(sHost, sUser, sPasswd, sDatabase, sCharSet, port, iFlag); _pstMql = mysql_init(NULL);}MysqlHelper::MysqlHelper(const DBConf& tcDBConf):_bConnected(false){ _dbConf = tcDBConf; _pstMql = mysql_init(NULL); }MysqlHelper::~MysqlHelper(){ if (_pstMql != NULL) { mysql_close(_pstMql); _pstMql = NULL; }}void MysqlHelper::init(const string& sHost, const string& sUser, const string& sPasswd, const string& sDatabase, const string &sCharSet, int port, int iFlag){ _dbConf._host = sHost; _dbConf._user = sUser; _dbConf._password = sPasswd; _dbConf._database = sDatabase; _dbConf._charset = sCharSet; _dbConf._port = port; _dbConf._flag = iFlag;}void MysqlHelper::init(const DBConf& tcDBConf){ _dbConf = tcDBConf;}void MysqlHelper::connect(){ disconnect(); if( _pstMql == NULL) { _pstMql = mysql_init(NULL); } //建立連接后, 自動調用設置字符集語句 if(!_dbConf._charset.empty()) { if (mysql_options(_pstMql, MYSQL_SET_CHARSET_NAME, _dbConf._charset.c_str())) { throw MysqlHelper_Exception(string("MysqlHelper::connect: mysql_options MYSQL_SET_CHARSET_NAME ") + _dbConf._charset + ":" + string(mysql_error(_pstMql))); } } if (mysql_real_connect(_pstMql, _dbConf._host.c_str(), _dbConf._user.c_str(), _dbConf._password.c_str(), _dbConf._database.c_str(), _dbConf._port, NULL, _dbConf._flag) == NULL)  { throw MysqlHelper_Exception("[MysqlHelper::connect]: mysql_real_connect: " + string(mysql_error(_pstMql))); } _bConnected = true;}void MysqlHelper::disconnect(){ if (_pstMql != NULL) { mysql_close(_pstMql); _pstMql = mysql_init(NULL); } _bConnected = false; }string MysqlHelper::escapeString(const string& sFrom){ if(!_bConnected) { connect(); } string sTo; string::size_type iLen = sFrom.length() * 2 + 1; char *pTo = (char *)malloc(iLen); memset(pTo, 0x00, iLen); mysql_real_escape_string(_pstMql, pTo, sFrom.c_str(), sFrom.length()); sTo = pTo; free(pTo); return sTo;}MYSQL *MysqlHelper::getMysql(void){ return _pstMql;}string MysqlHelper::buildInsertSQL(const string &sTableName, const RECORD_DATA &mpColumns){ ostringstream sColumnNames; ostringstream sColumnValues; map<string, pair<FT, string> >::const_iterator itEnd = mpColumns.end(); for(map<string, pair<FT, string> >::const_iterator it = mpColumns.begin(); it != itEnd; ++it) { if (it == mpColumns.begin()) { sColumnNames << "`" << it->first << "`"; if(it->second.first == DB_INT) { sColumnValues << it->second.second; } else { sColumnValues << "'" << escapeString(it->second.second) << "'"; } } else { sColumnNames << ",`" << it->first << "`"; if(it->second.first == DB_INT) { sColumnValues << "," + it->second.second; } else { sColumnValues << ",'" + escapeString(it->second.second) << "'"; } } } ostringstream os; os << "insert into " << sTableName << " (" << sColumnNames.str() << ") values (" << sColumnValues.str() << ")"; return os.str();}string MysqlHelper::buildReplaceSQL(const string &sTableName, const RECORD_DATA &mpColumns){ ostringstream sColumnNames; ostringstream sColumnValues; map<string, pair<FT, string> >::const_iterator itEnd = mpColumns.end(); for(map<string, pair<FT, string> >::const_iterator it = mpColumns.begin(); it != itEnd; ++it) { if (it == mpColumns.begin()) { sColumnNames << "`" << it->first << "`"; if(it->second.first == DB_INT) { sColumnValues << it->second.second; } else { sColumnValues << "'" << escapeString(it->second.second) << "'"; } } else { sColumnNames << ",`" << it->first << "`"; if(it->second.first == DB_INT) { sColumnValues << "," + it->second.second; } else { sColumnValues << ",'" << escapeString(it->second.second) << "'"; } } } ostringstream os; os << "replace into " << sTableName << " (" << sColumnNames.str() << ") values (" << sColumnValues.str() << ")"; return os.str();}string MysqlHelper::buildUpdateSQL(const string &sTableName,const RECORD_DATA &mpColumns, const string &sWhereFilter){ ostringstream sColumnNameValueSet; map<string, pair<FT, string> >::const_iterator itEnd = mpColumns.end(); for(map<string, pair<FT, string> >::const_iterator it = mpColumns.begin(); it != itEnd; ++it) { if (it == mpColumns.begin()) { sColumnNameValueSet << "`" << it->first << "`"; } else { sColumnNameValueSet << ",`" << it->first << "`"; } if(it->second.first == DB_INT) { sColumnNameValueSet << "= " << it->second.second; } else { sColumnNameValueSet << "= '" << escapeString(it->second.second) << "'"; } } ostringstream os; os << "update " << sTableName << " set " << sColumnNameValueSet.str() << " " << sWhereFilter; return os.str();}string MysqlHelper::getVariables(const string &sName){ string sql = "SHOW VARIABLES LIKE '" + sName + "'"; MysqlData data = queryRecord(sql); if(data.size() == 0) { return ""; } if(sName == data[0]["Variable_name"]) { return data[0]["Value"]; } return "";}void MysqlHelper::execute(const string& sSql){ /** 沒有連上, 連接數據庫 */ if(!_bConnected) { connect(); } _sLastSql = sSql; int iRet = mysql_real_query(_pstMql, sSql.c_str(), sSql.length()); if(iRet != 0) { /** 自動重新連接 */ int iErrno = mysql_errno(_pstMql); if (iErrno == 2013 || iErrno == 2006) { connect(); iRet = mysql_real_query(_pstMql, sSql.c_str(), sSql.length()); } } if (iRet != 0) { throw MysqlHelper_Exception("[MysqlHelper::execute]: mysql_query: [ " + sSql+" ] :" + string(mysql_error(_pstMql)));  }}MysqlHelper::MysqlData MysqlHelper::queryRecord(const string& sSql){ MysqlData data; /** 沒有連上, 連接數據庫 */ if(!_bConnected) { connect(); } _sLastSql = sSql; int iRet = mysql_real_query(_pstMql, sSql.c_str(), sSql.length()); if(iRet != 0) { /** 自動重新連接 */ int iErrno = mysql_errno(_pstMql); if (iErrno == 2013 || iErrno == 2006) { connect(); iRet = mysql_real_query(_pstMql, sSql.c_str(), sSql.length()); } } if (iRet != 0) { throw MysqlHelper_Exception("[MysqlHelper::execute]: mysql_query: [ " + sSql+" ] :" + string(mysql_error(_pstMql)));  } MYSQL_RES *pstRes = mysql_store_result(_pstMql); if(pstRes == NULL) { throw MysqlHelper_Exception("[MysqlHelper::queryRecord]: mysql_store_result: " + sSql + " : " + string(mysql_error(_pstMql))); } vector<string> vtFields; MYSQL_FIELD *field; while((field = mysql_fetch_field(pstRes))) { vtFields.push_back(field->name); } map<string, string> mpRow; MYSQL_ROW stRow; while((stRow = mysql_fetch_row(pstRes)) != (MYSQL_ROW)NULL) { mpRow.clear(); unsigned long * lengths = mysql_fetch_lengths(pstRes); for(size_t i = 0; i < vtFields.size(); i++) { if(stRow[i]) { mpRow[vtFields[i]] = string(stRow[i], lengths[i]); } else { mpRow[vtFields[i]] = ""; } } data.data().push_back(mpRow); } mysql_free_result(pstRes); return data;}size_t MysqlHelper::updateRecord(const string &sTableName, const RECORD_DATA &mpColumns, const string &sCondition){ string sSql = buildUpdateSQL(sTableName, mpColumns, sCondition); execute(sSql); return mysql_affected_rows(_pstMql);}size_t MysqlHelper::insertRecord(const string &sTableName, const RECORD_DATA &mpColumns){ string sSql = buildInsertSQL(sTableName, mpColumns); execute(sSql); return mysql_affected_rows(_pstMql);}size_t MysqlHelper::replaceRecord(const string &sTableName, const RECORD_DATA &mpColumns){ string sSql = buildReplaceSQL(sTableName, mpColumns); execute(sSql); return mysql_affected_rows(_pstMql);}size_t MysqlHelper::deleteRecord(const string &sTableName, const string &sCondition){ ostringstream sSql; sSql << "delete from " << sTableName << " " << sCondition; execute(sSql.str()); return mysql_affected_rows(_pstMql);}size_t MysqlHelper::getRecordCount(const string& sTableName, const string &sCondition){ ostringstream sSql; sSql << "select count(*) as num from " << sTableName << " " << sCondition; MysqlData data = queryRecord(sSql.str()); long n = atol(data[0]["num"].c_str()); return n;}size_t MysqlHelper::getSqlCount(const string &sCondition){ ostringstream sSql; sSql << "select count(*) as num " << sCondition; MysqlData data = queryRecord(sSql.str()); long n = atol(data[0]["num"].c_str()); return n;}int MysqlHelper::getMaxValue(const string& sTableName, const string& sFieldName,const string &sCondition){ ostringstream sSql; sSql << "select " << sFieldName << " as f from " << sTableName << " " << sCondition << " order by f desc limit 1"; MysqlData data = queryRecord(sSql.str()); int n = 0; if(data.size() == 0) { n = 0; } else { n = atol(data[0]["f"].c_str()); } return n;}bool MysqlHelper::existRecord(const string& sql){ return queryRecord(sql).size() > 0;}long MysqlHelper::lastInsertID(){ return mysql_insert_id(_pstMql);}size_t MysqlHelper::getAffectedRows(){ return mysql_affected_rows(_pstMql);}//////////////////////////////////////////////////////////////////////////////////////////////////////////////MysqlHelper::MysqlRecord::MysqlRecord(const map<string, string> &record):_record(record){}const string& MysqlHelper::MysqlRecord::operator[](const string &s){ map<string, string>::const_iterator it = _record.find(s); if(it == _record.end()) { throw MysqlHelper_Exception("field '" + s + "' not exists."); } return it->second;}//////////////////////////////////////////////////////////////////////////////////////////////////////////////vector<map<string, string> >& MysqlHelper::MysqlData::data(){ return _data;}size_t MysqlHelper::MysqlData::size(){ return _data.size();}MysqlHelper::MysqlRecord MysqlHelper::MysqlData::operator[](size_t i){ return MysqlRecord(_data[i]);}}//end namespace 

3.3使用demo

/*****************************************************@brief:mysqlhelper demo*@autor:lvlv*@date:2016.06.12*@MySQL version:MySQL Community Server 5.6.30 (GPL)****************************************************/#include <string.h>#include <iostream>#include <string>using namespace std;#include "mysqlHelper.h"using namespace mysqlhelper;int main(int argc,char* argv[]){ //初始化mysql對象并建立連接 MysqlHelper mysqlHelper; mysqlHelper.init("119.29.184.114","root","123456","StudentCourse"); try{ mysqlHelper.connect(); }catch(MysqlHelper_Exception& excep){ cout<<excep.errorInfo; return -1; } //增加一條學生記錄 //示例插入語句 //string sql="insert into student values("201421031060","呂呂","華南理工大學","2014","軟件工程",1)"; MysqlHelper::RECORD_DATA record; record.insert(make_pair("studentNo",make_pair(MysqlHelper::DB_STR,"201421031060"))); record.insert(make_pair("name",make_pair(MysqlHelper::DB_STR,"呂呂"))); record.insert(make_pair("school",make_pair(MysqlHelper::DB_STR,"廣州中醫藥大學"))); record.insert(make_pair("grade",make_pair(MysqlHelper::DB_STR,"2014"))); record.insert(make_pair("major",make_pair(MysqlHelper::DB_STR,"計算機科學與技術"))); record.insert(make_pair("gender",make_pair(MysqlHelper::DB_INT,"1"))); int res=0; try{ res=mysqlHelper.insertRecord("student",record); }catch(MysqlHelper_Exception& excep){ cout<<excep.errorInfo; return -1; } cout<<"res:"<<res<<" insert successfully "<<endl; //刪除一條學生記錄,學號為201421031059 try{ res=mysqlHelper.deleteRecord("student","where studentNo=/"201421031059/""); }catch(MysqlHelper_Exception& excep){ cout<<excep.errorInfo; return -1; } cout<<"res:"<<res<<" delete successfully "<<endl; //查找學號為201421031059的學生選擇的所有課程名稱 MysqlHelper::MysqlData dataSet; string querySQL="select courseName from course co where co.courseNo in (select courseNo from courseSelection where studentNo=/"201421031060/")"; try{ dataSet=mysqlHelper.queryRecord(querySQL); }catch(MysqlHelper_Exception& excep){ cout<<excep.errorInfo; return -1; } cout<<"query successfully"<<endl; for(size_t i=0;i<dataSet.size();++i){ cout<<dataSet[i]["courseName"]<<endl; } //修改學號為201421031060的學生專業 MysqlHelper::RECORD_DATA recordChange; recordChange.insert(make_pair("major",make_pair(MysqlHelper::DB_STR,"軟件工程"))); try{ res=mysqlHelper.updateRecord("student",recordChange,"where studentNo=/"201421031060/""); }catch(MysqlHelper_Exception& excep){ cout<<excep.errorInfo; return -1; } cout<<"res:"<<res<<" update successfully"<<endl; return 0;}

3.4makefile

################################### @brief:make scripts# @date:2016.05.28# @author:lvlv###################################environment varVPATH+=.CC:=g++FLAGS=-g -Wall -std=c++11INC+=-I/usr/local/mysql/includeLIBDIR+=-L/usr/local/mysql/libCPPDIRS=.CPPS=$(shell for dir in ${CPPDIRS};do echo $${dir}/*.cpp;done)OBJDIR=objOBJS=$(patsubst %.cpp,${OBJDIR}/%.o,$(notdir ${CPPS}))TARGET:=mysqlDemo.out${TARGET}:${OBJS} ${CC} ${FLAGS} ${OBJS} -o $@ ${LIBDIR} -lmysqlclient${OBJDIR}/%.o:./%.cpp ${CC} ${FLAGS} ${INC} -o $@ -c $<.PHONY:cleanclean: rm -f ${TARGET} ${OBJDIR}/*

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲视频777| 1769国内精品视频在线播放| 国产亚洲福利一区| 日韩欧美在线视频日韩欧美在线视频| 国产精品免费一区| 久久久国产一区二区三区| 久久精品国产91精品亚洲| 中文字幕亚洲天堂| 成人精品久久av网站| 欧美激情女人20p| 亚洲深夜福利在线| 日韩在线中文字幕| 欧美性猛交99久久久久99按摩| 成人午夜小视频| 久久成人精品电影| 国产精品观看在线亚洲人成网| 96pao国产成视频永久免费| 7777精品久久久久久| 国产精品678| 亚洲电影中文字幕| 91情侣偷在线精品国产| 欧美午夜激情小视频| 78色国产精品| 亚洲精品久久在线| 色久欧美在线视频观看| 欧美极品在线视频| 91香蕉亚洲精品| 久久91亚洲人成电影网站| 久久久噜噜噜久噜久久| 亚洲欧洲成视频免费观看| 精品国内亚洲在观看18黄| 亚洲男女性事视频| 国产精品羞羞答答| 国产精品偷伦一区二区| 久久久久中文字幕| 欧美精品18videos性欧美| 色偷偷av一区二区三区乱| 日韩欧美中文字幕在线观看| 这里只有精品丝袜| 国产精品无码专区在线观看| 欧美黄色小视频| 91精品国产综合久久香蕉922| 福利视频一区二区| 国产精品久久不能| 欧美夫妻性生活视频| 久久免费视频观看| 久久久久久国产精品久久| 亚洲美女久久久| 国产精品日韩精品| 国产亚洲视频在线| 国产做受高潮69| 96精品久久久久中文字幕| 亚洲最大激情中文字幕| 91精品国产99| 国产成人激情视频| 国产成人在线精品| 黑人巨大精品欧美一区二区| 久久亚洲国产精品成人av秋霞| 国产一区二区香蕉| 日韩av在线免播放器| 国产69精品久久久久久| 亚洲高清一二三区| 日韩中文字幕免费| 国产综合在线看| 成人精品在线视频| 亚洲精品国产综合区久久久久久久| 欧美色视频日本高清在线观看| 黑人与娇小精品av专区| 欧美洲成人男女午夜视频| 日韩av最新在线| 66m—66摸成人免费视频| 久久成人精品视频| 亚洲美女在线视频| 亚洲天堂免费在线| 国产精品久久久亚洲| 亚洲欧美日韩一区二区三区在线| 亚洲国语精品自产拍在线观看| 97超级碰碰人国产在线观看| 亚洲а∨天堂久久精品9966| 91久久久久久国产精品| 亚洲区中文字幕| 亚洲成人激情视频| 欧美大荫蒂xxx| 色综合男人天堂| 亚洲娇小xxxx欧美娇小| 色婷婷av一区二区三区在线观看| 欧美成在线观看| 欧美日韩中文字幕综合视频| 欧美肥臀大乳一区二区免费视频| 久久综合伊人77777蜜臀| 45www国产精品网站| 国产主播喷水一区二区| 欧美日韩国产精品一区二区不卡中文| 国产精品一区二区性色av| 亚洲成在人线av| 最近日韩中文字幕中文| 国产视频精品xxxx| 国模精品系列视频| 亚洲最大在线视频| 日韩人在线观看| 精品久久久久久久久久久久久| 国产亚洲美女精品久久久| 国产深夜精品福利| 国产精品爽黄69天堂a| 日韩av在线电影网| 久久久久久久久久久av| 丝袜亚洲另类欧美重口| 精品国偷自产在线视频| 久久久久久久999| 欧美日韩亚洲激情| 日韩午夜在线视频| 欧美丰满少妇xxxx| 亚洲欧美国产va在线影院| 成人观看高清在线观看免费| 国产一区二区三区视频免费| 国产精品福利无圣光在线一区| 成人av色在线观看| 91精品在线一区| 欧美午夜精品久久久久久久| 亚洲性69xxxbbb| 九九久久久久久久久激情| 粗暴蹂躏中文一区二区三区| 欧美在线观看网站| 久久中文字幕在线| 美女视频黄免费的亚洲男人天堂| 中文字幕亚洲一区| 亚洲美女av在线播放| 国产丝袜一区二区三区免费视频| 91精品国产综合久久男男| 亚洲伊人久久大香线蕉av| 久久人人爽亚洲精品天堂| 韩日精品中文字幕| 91美女片黄在线观| 午夜免费日韩视频| 日韩欧美中文字幕在线观看| 国产成+人+综合+亚洲欧洲| 91国自产精品中文字幕亚洲| 久久777国产线看观看精品| 亚洲精品91美女久久久久久久| 91九色综合久久| 日韩中文字幕在线免费观看| 欧美肥老太性生活视频| 亚洲日韩欧美视频一区| 日本一本a高清免费不卡| 国产色婷婷国产综合在线理论片a| 欧美性猛交xxxx富婆弯腰| 黑人与娇小精品av专区| 亚洲aⅴ日韩av电影在线观看| 国产精品一区二区女厕厕| 久久久久国产精品www| 亚洲性av在线| 国产精品专区一| 亚洲毛片在线观看| 国产91精品高潮白浆喷水| 亚洲综合在线播放| 精品伊人久久97| 成人在线视频网| 欧美精品www| 亚洲精品久久7777777| 欧美成人精品三级在线观看| 国产成人一区二区三区| 亚洲va欧美va在线观看| 欧美日韩国产成人在线| 亚洲天堂男人天堂女人天堂|