[C++] 操作MySql數據庫實例講解


學了這么久C++,數據庫訪問部門一直沒有多做了解,近來閑着,打算補上這一處的空白。於是果斷的在Fedora 14上安裝了數據庫mysql,做測試之用。以下鄙人就將實驗操作的過程總結一下,整理如下:

1) 安裝mysql數據庫
使用Windows的朋友們安裝過程就不用多說了。由於鄙人所使用的是Fedora,就以Feodra為例了。其余的安裝過程類似,不多做解釋,這不是重點。
因為鄙人對於msql而言是個新手,所以采用yum命令安裝。
root@XXX# yum install mysql
root@XXX# yum install mysql-server
root@XXX# yum install mysql-devel
root@XXX# chgrp -R mysql /var/lib/mysql
root@XXX# chmod -R 770 /var/lib/mysql
root@XXX# service mysqld start

2) 修改mysql 中root用戶密碼
安裝mysql的時候默認的root是沒有密碼的,這也無所謂了,但是修改root用戶密碼的時候就出現:

解決辦法:
修改mysql登錄設置 vi /etc/my.cnf
在[mysqld]段中加入 skip-grant-tables
保存之后重啟mysql服務
service mysqld restart
或者直接service mysqld stop
重啟mysql服務之后修改mysql密碼
[root@XXX]# mysql
Welcome to the MySQL monitor. Commands end with ; or /g.
Your MySQL connection id is 3 to server version: 3.23.56

Type 'help;' or '/h' for help. Type '/c' to clear the buffer.

mysql> USE mysql ;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> UPDATE user SET Password = password ( 'yourpassword' ) WHERE User = 'root' ; //更改密碼
Query OK, 0 rows affected (0.00 sec)
Rows matched: 2 Changed: 0 Warnings: 0

mysql> flush privileges ;
Query OK, 0 rows affected (0.01 sec)

mysql> quit
Bye
然后還原my.cnf就行了!!!

3) 創建一個簡單的表mytest
會點sql的就行了。
mysql> create database mytest;
mysql> use mytest;
mysql> create table student
>(
 id int primary key,
 Name nvarchar(20),
 Sex nvarchar(1),
 Score smallint
>);
接下來向數據表中插入一些數據。
Insert student(id, name, sex, score) values(1, ‘terry’, ‘男’, 90);
Insert student(id, name, sex, score) values(1, ‘hali’, ‘女’, 90);
4) 數據庫操作類(mysql 版,該類整理自互聯網)

/*    
* MySQLManager.h    
*    
*    Created on: 8.18, 2012   
*            Author: Terry
*/

#ifndef MYSQLMANAGER_H_    
#define MYSQLMANAGER_H_     

#include <mysql.h>    

#include <string>    
#include <iostream>    
#include <vector>    

#include <string.h>    

using namespace std;    

class MySQLManager    
{    
public:    
        /*    
         * Init MySQL    
         * @param hosts:         Host IP address    
         * @param userName:        Login UserName    
         * @param password:        Login Password    
         * @param dbName:        Database Name    
         * @param port:                Host listen port number    
         */    
        MySQLManager(std::string hosts, std::string userName, std::string password, std::string dbName, unsigned int port);    
        ~MySQLManager();    
        void initConnection();    
        /*    
         * Making query from database    
         * @param mysql:        MySQL Object    
         * @param sql:                Running SQL command    
         */    
        bool runSQLCommand(std::string sql);
        /*
         * 執行插入語句
         * @param sql: 執行的SQL語句
         * @return: 受影響的行數  
         */
        unsigned int insert(std::string sql);
        /**    
         * Destroy MySQL object    
         * @param mysql                MySQL object    
         */    
        void destroyConnection();    
        bool getConnectionStatus();    
        vector< vector<string> > getResult();    
protected:    
        void setUserName(std::string userName);    
        void setHosts(std::string hosts);    
        void setPassword(std::string password);    
        void setDBName(std::string dbName);    
        void setPort(unsigned int port);    
private:    
        bool IsConnected;    
        vector< vector<string> > resultList;    
        MYSQL mySQLClient;    
        unsigned int DEFAULTPORT;    
        char * HOSTS;    
        char * USERNAME;    
        char * PASSWORD;    
        char * DBNAME;    
};    

#endif /* MYSQLMANAGER_H_ */ 
/*    
* MySQLManager.cpp    
*    
*    Created on:8. 18, 2012    
*            Author: Terry
*/    
#include "MySQLManager.h"    

MySQLManager::MySQLManager(string hosts, string userName, string password, string dbName, unsigned int port)    
{    
        IsConnected = false;    
        this ->setHosts(hosts);            //    設置主機IP地址    
        this ->setUserName(userName);            //    設置登錄用戶名    
        this ->setPassword(password);            //    設置登錄密碼    
        this ->setDBName(dbName);            //    設置數據庫名    
        this ->setPort(port);            //    設置端口號    
}    

MySQLManager::~MySQLManager()    
{    
        this ->destroyConnection();    
}    

void MySQLManager::setDBName(string dbName)    
{    
        if ( dbName.empty() )    
        {//        用戶沒有指定數據庫名    
                std::cout << "DBName is null! Used default value: mysql" << std::endl;    
                this ->DBNAME = new char[5];    
                strcpy(this ->DBNAME, "mysql");    
        }    
        else    
        {    
                this ->DBNAME = new char[dbName.length()];    
                strcpy(this ->DBNAME, dbName.c_str());    
        }    
}    

void MySQLManager::setHosts(string hosts)    
{    
        if ( hosts.empty() )    
        {//    用戶沒有指定數據庫IP地址    
                std::cout << "Hosts is null! Used default value: localhost" << std::endl;    
                this ->HOSTS = new char[9];    
                strcpy(this ->HOSTS, "localhost");    
        }    
        else    
        {    
                this ->HOSTS = new char[hosts.length()];    
                strcpy(this ->HOSTS, hosts.c_str());    
        }    
}    

void MySQLManager::setPassword(string password)    
{//    用戶沒有指定密碼    
        if ( password.empty() )    
        {    
                std::cout << "Password is null! Used default value: " << std::endl;    
                this ->PASSWORD = new char[1];    
                strcpy(this ->PASSWORD, "");    
        }    
        else    
        {    
                this ->PASSWORD = new char[password.length()];    
                strcpy(this ->PASSWORD, password.c_str());    
        }    
}    

void MySQLManager::setPort(unsigned int port)    
{//    用戶沒有指定端口號,使用默認端口號    
        if ( port <= 0 )    
        {    
                std::cout << "Port number is null! Used default value: 0" << std::endl;    
                this->DEFAULTPORT = 0;
        }    
        else    
        {    
                this ->DEFAULTPORT = port;    
        }    
}    

void MySQLManager::setUserName(string userName)    
{//    用戶沒有指定登錄用戶名    
        if ( userName.empty() )    
        {    
                std::cout << "UserName is null! Used default value: root" << std::endl;    
                this ->USERNAME = new char[4];    
                strcpy(this ->USERNAME, "root");    
        }    
        else    
        {    
                this ->USERNAME = new char[userName.length()];    
                strcpy(this ->USERNAME, userName.c_str());    
        }    
}    

void MySQLManager::initConnection()    
{    
        if ( IsConnected )    
        {//    已經連接到服務器    
                std::cout << "Is connected to server!" <<std::endl;    
                return;    
        } 
        mysql_init(&mySQLClient);//    初始化相關對象    
        if ( !mysql_real_connect( &mySQLClient, HOSTS, USERNAME, PASSWORD, DBNAME, DEFAULTPORT, NULL, 0) )    
        {//    連接到服務器
                cout << "HHHHHHHHHHHHH"<<endl;
                std::cout << "Error connection to database: \n" << mysql_error(&mySQLClient) << std::endl;    
        }    
        IsConnected = true;//    修改連接標識    
}    

bool MySQLManager::runSQLCommand(string sql)    
{    
        if ( !IsConnected )    
        {//    沒有連接到服務器    
                std::cout << "Not connect to database!" << std::endl;    
                return false;    
        }    
        if ( sql.empty() )    
        {//    SQL語句為空    
                std::cout << "SQL is null!" << std::endl;    
                return false;    
        }    

        MYSQL_RES *res;    
        MYSQL_ROW row;    

        unsigned int i,j = 0;    

        i = mysql_real_query(&mySQLClient,sql.c_str(),(unsigned int)strlen(sql.c_str()));//    執行查詢    
        if ( i < 0 )    
        {    
                std::cout << "Error query from database: \n" << mysql_error(&mySQLClient) << std::endl;    
                return false;    
        }    
        res = mysql_store_result(&mySQLClient);    
        vector<string> objectValue;    
        while( (row = mysql_fetch_row(res)) )    
        {//    遍歷結果集    
                objectValue.clear();    
                for ( j = 0 ; j < mysql_num_fields(res) ; j++ )    
                {    
                        objectValue.push_back(row[j]);    
                }    
                this ->resultList.push_back(objectValue);    
        }    
        mysql_free_result(res);         //free result after you get the result    

        return true;    
}

unsigned int MySQLManager::insert(std::string sql)
{
    if(!isConnected) {
        cout << "" << endl;
        return -1;
    }
    if(sql.empty()){
        cout << "sql is null " << endl;
        return -1;
    }
    int rows = -1;
    int res = mysql_query(&mySQLClient, sql.c_str());
    if(res >= 0){
        // 返回受影響的行數
        rows = mysql_affected_rows(&mySQLClient);
        cout << "Inserted "<< rows << " rows\n";
        return rows;
    } else {
        cout << "Insert error " << mysql_errno(&mySQLClient) << "," << mysql_error(&mySQLClient) << endl;
        return -1;
    }
}

vector< vector<string> > MySQLManager::getResult()    
{    
        return resultList;    
}    

void MySQLManager::destroyConnection()    
{    
        mysql_close(&mySQLClient);    
        this ->IsConnected = false;    
}    

bool MySQLManager::getConnectionStatus()    
{    
        return IsConnected;    
} 

 

 下面是測試主程序main.cc:

#include "MySQLManager.h"

#include <iostream>
#include <vector>

using namespace std;

int main() 
{
	MySQLManager *mysql = new MySQLManager("127.0.0.1", "root", "xufeiyang", "mytest", (unsigned int)3306);
	mysql->initConnection();
	if(mysql->getConnectionStatus())
	{
		if(mysql->runSQLCommand("select * from student"))
		{
			vector<vector<std::string> > result = mysql->getResult();
			for(auto & vec : result)
			{
				for(auto &str : vec) {
                                     cout << str.c_str() << " ";
			        }
				cout << endl;
			}
		}
		else
			cout << "執行失敗" << endl;
	}
	else 
		cout << "連接未建立" << endl;
		
	return 0;
}

  

程序結果是:

不幸的是:修改了數據庫中的默認編碼是utf8,C++中的使用的string,結果書出來遇見漢字就是個?,嘗試了C++11中的寬字符和本地化解決問題,但是效果不好,依然顯示不出來,希望有辦法解決的前輩留個話,謝謝了。

 

期待下一次嘗試操作Oracle。

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM