https://my.oschina.net/bobwei/blog/359759?p=1
在这个程序中,比上一次的要完善一些,实现了通过C++对数据表进行添加,修改,插入,删除的功能。
头文件——myDB.h:
#ifndef myDB_class
#define myDB_class
#include <iostream>
#include <string>
#include <mysql/mysql.h>
class myDB
{
public:
myDB();
~myDB();
int initDB(std::string host, std::string user, std::string password, std::string db_name);
void Run();
private:
int exeSQL();
int insertSQL();
int deleteSQL();
int updateSQL();
MYSQL *connection;
MYSQL_RES *result;
MYSQL_ROW row;
};
#endif
myDB.cpp
#include "myDB.h"
#include <iostream>
#include <cstdlib>
using namespace std;
myDB::myDB()
{
connection = mysql_init(NULL); // 初始化数据库的连接变量
if(connection == NULL)
{
std::cout << "error:" << mysql_error(connection);
exit(1); // exit(1)表示发生错误后退出程序, exit(0)表示正常退出
}
}
myDB::~myDB()
{
if(connection != NULL)
{
mysql_close(connection); // 关闭数据库连接
}
}
int myDB::initDB(std::string host, std::string user, std::string password, std::string db_name)
{
char value = 1;
mysql_options(connection_,MYSQL_OPT_RECONNECT,(char*)&value);//mysql自动重连
connection = mysql_real_connect(connection, host.c_str(), user.c_str(), password.c_str(), db_name.c_str(), 0, NULL, 0); // 建立数据库连接
if(connection == NULL)
{
std::cout << "error:" << mysql_error(connection);
exit(1); // exit(1)表示发生错误后退出程序, exit(0)表示正常退出
}
return 0;
}
int myDB::exeSQL()
{
// mysql_query()执行成功返回0,失败返回非0值。与PHP中不一样
std::string sql;
sql = "select * from user;";
if(mysql_query(connection, sql.c_str()))
{
std::cout << "Query Error:" << mysql_error(connection);
exit(1);
}
else
{
result = mysql_use_result(connection); // 获取结果集
// mysql_field_count()返回connection查询的列数
for(int i=0; i < mysql_field_count(connection); ++i)
{
// 获取下一行
row = mysql_fetch_row(result);
if(row <= 0)
{
break;
}
// mysql_num_fields()返回结果集中的字段数
for(int j=0; j < mysql_num_fields(result); ++j)
{
std::cout << row[j] << " ";
}
std::cout << endl;
}
std::cout << endl;
// 释放结果集的内存
mysql_free_result(result);
}
return 0;
}
int myDB::insertSQL()
{
std::string username;
std::string psd;
std::string level;
std::cout << "请输入id、username、password、level:" << std::endl;
std::cin >> username >> psd >> level;
string sql = "insert into user(id,username,password,level) values ( NULL,'" + username +"','"+ psd +"', "+ level +");";
if(mysql_query(connection, sql.c_str()))
{
std::cout << "Query Error:" << mysql_error(connection);
exit(1);
}
std::cout << endl;
exeSQL();
return 0;
}
int myDB::deleteSQL()
{
std::string id;
std::cout << "输入要删除用户的ID:" << std::endl;
std::cin >> id;
std::string sql;
sql = "delete from user where id = " + id + ";";
if(mysql_query(connection, sql.c_str()))
{
std::cout << "Query Error:" << mysql_error(connection);
exit(1);
}
std::cout << endl;
exeSQL();
return 0;
}
int myDB::updateSQL()
{
std::string id;
std::string thing;
std::cout << "请输入要修改的用户的id与内容(eg:修改1号用户的姓名,输入:1 【回车】 username = 'Mary')" << std::endl;
std::cin >> id >> thing;
std::string sql;
sql = "update user set " + thing + "where id =" + id + ";";
if(mysql_query(connection, sql.c_str()))
{
std::cout << "Query Error:" << mysql_error(connection);
exit(1);
}
std::cout << endl;
exeSQL();
return 0;
}
void myDB::Run()
{
int i = 1;
while(i != 0)
{
int sel;
std::cout << "1、查询 2、添加 3、删除 4、修改 5、退出" << std::endl;
std::cin >> sel;
switch(sel)
{
case 1:exeSQL();
break;
case 2:insertSQL();
break;
case 3:deleteSQL();
break;
case 4:updateSQL();
break;
case 5:i = 0;
break;
default:std::cout << "error" << std::endl;
break;
}
}
}
main.cpp
#include <iostream>
#include "myDB.h"
int main()
{
myDB db;
db.initDB("localhost", "root", "wei123", "wei");
db.Run();
return 0;
}
所有代码就都在这里了,下面是makefile文件
Makefile
mydb:main.cpp myDB.cpp
g++ -o mydb main.cpp myDB.cpp -lmysqlclient
clean:
rm -f *.o mydb
(g++ 和rm之前用Tab隔开)