您好,欢迎访问一九零五行业门户网

Linux下如何实现C++操作Mysql数据库的详细介绍

由于工作需要抽出一周的时间来研究c/c++访问各种数据库的方法,并打算封装一套数据库操作类,现在奉上最简单的一部分:在linux下访问mysql数据库。
想用c++写项目,数据库是必须的,所以这两天学了一下c++操作mysql数据库的方法。也没有什么教程,就是在网上搜的知识,下面汇总一下。
连接mysql数据库有两种方法:第一种是使用ado连接,不过这种只适合windows平台;第二种是使用mysql自己的c api函数连接数据库。我是在linux平台下开发,所以就采用第二种方法,有很多api函数,但是常用的就几个,我也是就用到其中的几个。
api函数
1.mysql_real_connect()
连接一个mysql服务器
mysql *mysql_real_connect (mysql *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned long client_flag)
如果连接成功,返回mysql*连接句柄。如果连接失败,返回null。对于成功的连接,返回值与第1个参数的值相同
2.mysql_query()
执行指定”以null终结的字符串”的sql查询
返回一个结果表,假定查询成功,可以调用 mysql_num_rows() 来查看对应于 select 语句返回了多少行,或者调用 mysql_affected_rows() 来查看对应于 delete,insert,replace 或 update 语句影响到了多少行。
3.mysql_store_result()
mysql_res *mysql_store_result(mysql *mysql)
检索完整的结果集至客户端。客户端处理结果集最常用的方式是通过调用mysql_store_result(),一次性地检索整个结果集。该函数能从服务器获得查询返回的所有行,并将它们保存在客户端。对于成功检索了数据的每个查询(select、show、describe、explain、check table等),必须调用mysql_store_result()或mysql_use_result() 。对于其他查询,不需要调用mysql_store_result()或mysql_use_result(),但是如果在任何情况下均调用了mysql_store_result(),它也不会导致任何伤害或性能降低。
4.mysql_num_rows()
返回结果集中的行数。
5.mysql_num_fields()
返回结果集中的字段数,如果失败,则返回 false。
6.mysql_fetch_field()
mysql_field* mysql_fetch_field(mysql_res *result);
获取下一个表字段的类型,结束返回null。
7.mysql_fetch_row()
mysql_row mysql_fetch_row(mysql_res *result);
从结果集中获取下一行,成功返回一个数组,值大于0。
8.mysql_fetch_field_direct()
mysql_field* mysql_fetch_field_direct(mysql_res *result, int i);
给定字段编号,返回表字段的类型,结束返回null。
简单的学生信息管理代码
光看也记不住啊,就用这些函数写了一个学生信息管理界面,唉,去年这时候c语言课程设计,当时还不知道用数据库,全用文件写的,知道晚了很后悔啊。。。。下面是代码:
/************************************************************************* > file name: student.cpp > author: tanswer_ > mail: 98duxm@gmail.com > created time: 2017年05月28日 星期日 16时50分34秒 ************************************************************************/ #include <iostream> #include <string> #include <stack> #include <algorithm> #include <sstream> #include <mysql/mysql.h> #include <unistd.h> using namespace std; mysql mysql; mysql_row row; mysql_field* field = null; mysql_res* result; string inttostr(int num) { stringstream ss; ss.clear(); ss << num; return ss.str(); } void add() { string fname,fsex,ftel,faddr; int fage; char choice; do { ┊ cout << "请依次输入以下信息:" << endl; ┊ cout << "\nname: ";cin >> fname; ┊ cout << "\nsex: ";cin >> fsex; ┊ cout << "\nage: "; cin >> fage; ┊ cout << "\ntel: "; cin >> ftel; ┊ cout << "\naddr: "; cin >> faddr; ┊ string sql = "insert into infor (name,sex,tel,addr,age) values('"+fname+"','"+fsex+"','"+ftel+"','"+faddr+"', "+inttostr(fage)+");"; ┊ //string sql = "insert into infor (name,sex,age,tel,addr) values('小红','女',18,'13333333333', '陕西省西安市雁塔区');"; ┊ mysql_query(&mysql,sql.c_str()); ┊ ┊ ┊ cout << "是否继续添加(y/n)?: "; ┊ cin >> choice; }while(choice == 'y'); } void select() { int id; cout << "请输入要查询学生的学号: "; cin >> id; string sql = "select * from infor where id = "+inttostr(id)+";"; mysql_query(&mysql,sql.c_str()); result = mysql_store_result(&mysql); if(result == null) ┊ cout << "fail\n"; for(int i=0; i<mysql_num_fields(result); i++) { ┊ field = mysql_fetch_field_direct(result,i); ┊ cout << field->name << "\t\t"; } cout << endl; row = mysql_fetch_row(result); while(row != null) { ┊ for(int i=0; i<mysql_num_fields(result); i++) ┊ { ┊ ┊ cout << row[i] << "\t\t"; ┊ } ┊ cout << endl; ┊ row = mysql_fetch_row(result); } } void update() { int id; char choice; string newaddr; ┊ cout << "请输入要修改同学的学号: "; ┊ cin >> id; ┊ cout << endl << "请输入修改后的地址: "; ┊ cin >> newaddr; ┊ string sql = "update infor set addr = '"+newaddr+"'where id= "+inttostr(id)+"; "; ┊ mysql_query(&mysql,sql.c_str()); ┊ } int main() { char choice[5]; mysql_init(&mysql); /*连接数据库*/ if(!mysql_real_connect(&mysql,"localhost","root","dxm242012","student",0,null,0)) { ┊ cout << "connect fial\n"; ┊ return -1; } while(atoi(choice) != 'q') { ┊ sleep(4); ┊ system("clear"); ┊ cout << "1.添加学生信息" << endl; ┊ cout << "2.查询学生信息" << endl; ┊ cout << "3.修改学生信息" << endl; ┊ cin >> choice; ┊ cout << choice << endl; ┊ switch(atoi(choice)) ┊ { ┊ ┊ case 1: ┊ ┊ ┊ add(); ┊ ┊ ┊ break; ┊ ┊ case 2: ┊ ┊ ┊ select(); ┊ ┊ ┊ break; ┊ ┊ case 3: ┊ ┊ ┊ update(); ┊ ┊ ┊ break; ┊ ┊ default: ┊ ┊ ┊ break; ┊ } } mysql_close(&mysql); return 0; }
c++封装mydb类
后来又把这些函数简单的封装了一下,方便以后直接用。
/************************************************************************* > file name: mydb.h > author: tanswer_ > mail: 98duxm@gmail.com > created time: 2017年05月28日 星期日 22时26分22秒 ************************************************************************/ #ifndef _mydb_h #define _mydb_h #include <string> #include <iostream> #include <mysql/mysql.h> using namespace std; class mydb { public: mydb(); ~mydb(); bool initdb(string host,string user,string pwd,string dbname); bool exesql(string sql); private: mysql* mysql; mysql* mysql; mysql_row row; mysql_res* result; mysql_field* field; }; #endif /************************************************************************* > file name: mydb.cpp > author: tanswer_ > mail: 98duxm@gmail.com > created time: 2017年05月28日 星期日 22时27分18秒 ************************************************************************/ #include <iostream> #include <string> #include <stack> #include <algorithm> #include <mysql/mysql.h> #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(!mysql) { ┊ mysql_close(mysql); } } bool mydb::initdb(string host,string user,string pwd,string dbname) { /*连接数据库*/ if(!mysql_real_connect(mysql,host.c_str(),user.c_str(),pwd.c_str(),dbname.c_str(),0,null,0)) { ┊ cout << "connect fial: " << mysql_error(mysql); ┊ exit(-1); } return true; } bool mydb::exesql(string sql) { /*执行失败*/ if(mysql_query(mysql,sql.c_str())) { ┊ cout << "query fail: " << mysql_error(mysql); ┊ exit(1); } else { ┊ /*获取结果集*/ ┊ result = mysql_store_result(mysql); ┊ int fieldnum = mysql_num_fields(result); ┊ for(int i=0; i<fieldnum; i++) ┊ { ┊ ┊ row = mysql_fetch_row(result); ┊ ┊ if(row <= 0) ┊ ┊ ┊ break; ┊ ┊ for(int j=0; j<fieldnum; j++) ┊ ┊ { ┊ ┊ ┊ cout << row[j] << "\t\t"; ┊ ┊ } ┊ ┊ cout << endl; ┊ } ┊ mysql_free_result(result); } return true; } /************************************************************************* > file name: main.cpp > author: tanswer_ > mail: 98duxm@gmail.com > created time: 2017年05月28日 星期日 22时53分43秒 ************************************************************************/ #include <iostream> #include <string> #include <stack> #include <algorithm> #include <mysql/mysql.h> #include "mydb.h" using namespace std; int main() { mydb db; db.initdb("localhost","root","xxxxxx","student"); db.exesql("select * from infor;"); return 0; }
以下是运行结果:
下面是遇到的问题:
1. 编译时出错
没有那个文件或目录
#include<mysql/mysql.h> ^
编译中断。
解决:除了mysql-client和mysql-server,又安装了mysql-devel,然后就解决了。
2. 自定义的变量传入sql语句时,出现问题
在网上查找到这样一种格式,
string sql = "insert into infor (name,sex,tel,addr,age) values('"+fname+"','"+fsex+"','"+ftel+"','"+faddr+"', "+inttostr(fage)+");";
然后string类型的可以成功,整型的变量还是不行,我又写了个函数把int转为string。
string inttostr(int num) { stringstream ss; ss.clear(); ss << num; return ss.str(); }
以上就是linux下如何实现c++操作mysql数据库的详细介绍的详细内容。
其它类似信息

推荐信息