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); }
文件目录
结果如下
//