c++ centos linux mysql通讯案例(安装和验证)

近期需要做c++与mysql通讯,

[root@VM-0-7-centos test]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
[root@VM-0-7-centos test]#

1.  安装mysql-client等软件

# c++开发mysql
# https://downloads.mysql.com/archives/community/
# 移除自带的mariadb
rpm -qa|grep "mariadb"|xargs rpm -e --nodeps
# 安装源
rpm -ivh https://repo.mysql.com//mysql57-community-release-el7-11.noarch.rpm
# 查找是否有对应的客户端
yum search mysql-community
# 下载安装
yum install mysql-community-client.x86_64 -y 
yum reinstall mysql-libs -y
# 安装
yum install mysql-devel -y 
# 查看安装的内容
rpm -qa|grep mysql

 

mysql 常用指令

# mysql常用指令
# net stop mysql
# net start mysql
# mysql -uroot -p
# mysql [-h127.0.0.1] [-P3306] -uroot -p         (端口要用大写P,与密码p加以区分)
# CREATE USER 'ashuai'@'%' IDENTIFIED BY '123456';              创建ashuai账号,所有主机都可以使用,密码123456
# GRANT ALL PRIVILEGES ON *.* TO 'ashuai'@'%' WITH GRANT OPTION;          给账号ashuai所有权限
# ALTER USER 'ashuai'@'%' IDENTIFIED BY '654321';          修改账号密码
# DROP USER 'ashuai'@'%';          删除账号
# FLUSH PRIVILEGES;          更新缓存(账号修改完毕之后,记得刷新一次缓存,不然不起效)
# select host,user,password from  mysql.user;        查询已创建用户和主机
# describe user;          用于查看特定表的详细设计信息
# quit;

# create database db_test;
# use db_test;
# show tables;
# source /home/db.sql

 

 

 

2. c++链接源码(网上有很多,此处附加了输出行数,列数,解决了数组输出遇到NULL停止输出的bug)

 

main.cpp

 

#include<iostream>
#include"MyDB.h"
using namespace std;
int main()
{
    MyDB db; 
    //连接数据库
    db.initDB("localhost","root","password","database");
    //将用户信息添加到数据库
    //db.exeSQL("INSERT accounts values('axin','456');");
    //将所有用户信息读出,并输出。
    if(db.exeSQL("SELECT * from redisdata;")==true && db.result){
        for(int i=0;i<db.rows;i++) //输出每一行
        {
            //获取下一行数据
            db.fetchRow();
            if(db.row<0) break;
            for(int j=0;j<db.fields;j++)  //输出每一字段
            {
                if(db.row[j]==NULL)cout<<"null"<< "\t\t";
                else cout<<db.row[j]<<    "\t\t";
            }
            cout<<endl;
        }
        cout<<endl<<endl<<endl;
    }
    return 0;
}

 

 

makefile

all:
    g++  main.cpp MyDB.cpp -o main  `mysql_config --cflags --libs` 

 

MyDB.h

 

/*************************************************************************
> File Name: MyDB.cpp
> Author:Ashuai 
> Mail:2829735186@qq.com 
> Created Time: 2021年05月19日 星期三 18时55分55秒
************************************************************************/

#ifndef _MYDB_H
#define _MYDB_H
#include <iostream>
#include <string>
#include <stack>
#include <algorithm>  
#include <mysql/mysql.h>
using namespace std;

class MyDB
{
    public:
        MyDB();
        ~MyDB();
        bool initDB(string host,string user,string pwd,string db_name); //连接mysql
        bool exeSQL(string sql);   //执行sql语句
        bool freeResult();      //释放查询结果内存
        void fetchRow();        //获取下一行
    public:
        MYSQL_RES *result;      //指向查询结果的指针
        int fields;             //查询结果一共多少列(字段)
        int rows;               //查询结果一共多少行 
        MYSQL_ROW row;          //按行返回的查询信息
    private:
        MYSQL *mysql;           //连接mysql句柄指针
        
};


#endif


// //测试 demo  main.cpp  编译     g++  main.cpp MyDB.cpp -o main `mysql_config --cflags --libs`     
// #include<iostream>
// #include"MyDB.h"
// using namespace std;
// int main()
// {
//     MyDB db; 
//     //连接数据库
//     db.initDB("localhost","root","password","database");
//     //将用户信息添加到数据库
//     //db.exeSQL("INSERT accounts values('111','456');");
//     //将所有用户信息读出,并输出。
//     if(db.exeSQL("SELECT * from redisdata;")==true && db.result){
//         for(int i=0;i<db.rows;i++) //输出每一行
//         {
//             //获取下一行数据
//             db.fetchRow();
//             if(db.row<0) break;
//             for(int j=0;j<db.fields;j++)  //输出每一字段
//             {
//                 if(db.row[j]==NULL)cout<<"null"<< "\t\t";
//                 else cout<<db.row[j]<<    "\t\t";
//             }
//             cout<<endl;
//         }
//         cout<<endl<<endl<<endl;
//     }
//     return 0;
// }

 

 

MyDB.cpp

 

/*************************************************************************
> File Name: MyDB.cpp
> Author:Ashuai 
> Mail:2829735186@qq.com 
> Created Time: 2021年05月19日 星期三 18时55分55秒
************************************************************************/

#include<iostream>
#include<string>
#include "MyDB.h"

using namespace std;

MyDB::MyDB()
{
    mysql=mysql_init(NULL);   //初始化数据库连接变量
    if(mysql==NULL)
    {
        cout<<"Error:"<<mysql_error(mysql);
        exit(1);
    }
}

MyDB::~MyDB()
{
    if (result) mysql_free_result(result);
    if(mysql!=NULL)  //关闭数据连接
    {
        mysql_close(mysql);
    }
}


bool MyDB::initDB(string host,string user,string passwd,string db_name)
{
    // 函数mysql_real_connect建立一个数据库连接  
    // 成功返回MYSQL*连接句柄,失败返回NULL  
    mysql = mysql_real_connect(mysql, host.c_str(), user.c_str(), passwd.c_str(), db_name.c_str(), 0, NULL, 0);  
    if(mysql == NULL)  
    {  
        cout << "Error: " << mysql_error(mysql);  
        exit(1);  
    }  
    return true;  
}

bool MyDB::exeSQL(string sql)
{
    //mysql_query()执行成功返回0,执行失败返回非0值。
    if (mysql_query(mysql,sql.c_str()))
    {
        cout<<"Query Error: "<<mysql_error(mysql);
        return false;
    }
    else // 查询成功
    {
        result = mysql_store_result(mysql);  //获取结果集
        if (result)  // 返回了结果集
        {
            fields = mysql_num_fields(result); 
            rows=mysql_num_rows(result);
            return true;
        }
        else  // result==NULL
        {
            if(mysql_field_count(mysql) == 0)   //代表执行的是update,insert,delete类的非查询语句
            {
                // (it was not a SELECT)
                rows = mysql_affected_rows(mysql);  //返回update,insert,delete影响的行数
                fields = 0 ;
                return true;
            }
            else // error
            {
                cout<<"Get result error: "<<mysql_error(mysql);
                return false;
            }
        }
    }
    return false;
}

// 释放结果集的内存
bool MyDB::freeResult(){
    if (result) mysql_free_result(result);
    fields = 0;
    rows = 0;
    return true;
}

//row = mysql_num_rows(result);
void MyDB::fetchRow(){
    if(result) row=mysql_fetch_row(result);
}

 

 

 

文件目录

 

 

结果如下

 

 

 

 

//

 

posted @ 2021-05-19 13:13  小城熊儿  阅读(300)  评论(0编辑  收藏  举报