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

由于工作需要抽出一周的时间来研究c/c++访问各种数据库的方法,并打算封装一套c类,现在奉上最简单的一部分:在c下访问c

想用C++写项目,数据库是必须的,所以这两天学了一下C++操作MySQL数据库的方法。也没有什么教程,就是在网上搜的知识,下面汇总一下。

连接MySQL数据库有两种方法:第一种是使用ADO连接,不过这种只适合Windows平台;第二种是c自己的C ccc。我是在Linux平台下开发,所以就采用第二种方法,有很多Api函数,但是常用的就几个,我也是就用到其中的几个。

API函数

1.mysql_real_connect()

立即学习C++免费学习笔记(深入)”;

连接一个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*连接句柄。如果连接失败,返回c。对于成功的连接,返回值与第1个参数的值相同

2.c()

执行指定”以NULL终结的c”的SQLc

返回一个结果表,假定查询成功,可以调用 c() 来查看对应于 SELECT 语句返回了多少行,或者调用 c() 来查看对应于 c,INSERT,REPLACE 或 UPc 语句影响到了多少行。

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.c()

返回结果集中的字段数,如果失败,则返回 false。

6.c()

MYSQL_FIELD* mysql_fetch_field(MYSQL_RES *result);
获取下一个表字段的类型,结束返回NULL。

7.c()

MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);

从结果集中获取下一行,成功返回一个c,值大于0。

8.mysql_fetch_field_cect()

MYSQL_FIELD* mysql_fetch_field_direct(MYSQL_RES *result, int i);

给定字段编号,返回表字段的类型,结束返回NULL。

简单的学生信息管理代码

光看也记不住啊,就用这些函数写了一个学生信息管理界面,唉,去年这时候c课程设计,当时还不知道用数据库,全用文件写的,知道晚了很后悔啊。。。。下面是代码:

 /*************************************************************************     &gt; File Name: student.cpp     &gt; Author: Tanswer_      &gt; Mail: 98duxm@gmail.com     &gt; Created Time: 2017年05月28日 星期日 16时50分34秒   ************************************************************************/               #include <iostream>   #include <string>    #include <stack>    #include <algorithm>   #include <sstream>   #include <mysql>   #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 &gt; fname;     ┊  cout &gt; fsex;     ┊  cout &gt; fage;     ┊  cout &gt; ftel;     ┊  cout &gt; 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(&amp;mysql,sql.c_str());     ┊  ┊                    ┊  cout &gt; choice;                                                     }while(choice == 'y');                                }                                            void Select()                {                        int id;                   cout &gt; id;                                        string sql = "SELECT * FROM Infor WHERE id = "+IntToStr(id)+";";     mysql_query(&amp;mysql,sql.c_str());                   result = mysql_store_result(&amp;mysql);     if(result == NULL)     ┊  cout name &gt; id;               ┊  cout &gt; newaddr;     ┊  string sql = "UPDATE Infor SET addr = '"+newaddr+"'WHERE id= "+IntToStr(id)+"; ";     ┊  mysql_query(&amp;mysql,sql.c_str());                                            ┊        }                              int main()     {            char choice[5];               mysql_init(&amp;mysql);     /*连接数据库*/     if(!mysql_real_connect(&amp;mysql,"localhost","root","dxm242012","Student",0,NULL,0))     {          ┊  cout &gt; choice;          ┊  cout <p>C++封装MyDB类</p> <p>后来又把这些函数简单的封装了一下,方便以后直接用。</p> <pre class="brush:cpp;"> /*************************************************************************     &gt; File Name: myDB.h     &gt; Author: Tanswer_     &gt; Mail: 98duxm@gmail.com     &gt; Created Time: 2017年05月28日 星期日 22时26分22秒   ************************************************************************/       #ifndef _MYDB_H   #define _MYDB_H       #include <string>   #include <iostream>   #include <mysql>   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                                                                /*************************************************************************                           &gt; File Name: myDB.cpp     &gt; Author: Tanswer_     &gt; Mail: 98duxm@gmail.com     &gt; Created Time: 2017年05月28日 星期日 22时27分18秒   ************************************************************************/      #include <iostream>   #include <string>   #include <stack>   #include <algorithm>      #include <mysql>    #include "myDB.h"      using namespace std;      MyDB::MyDB()      {     mysql = mysql_init(NULL);     if(mysql == NULL)     {     ┊  cout  File Name: main.cpp     &gt; Author: Tanswer_     &gt; Mail: 98duxm@gmail.com     &gt; Created Time: 2017年05月28日 星期日 22时53分43秒   ************************************************************************/         #include <iostream>   #include <string>   #include <stack>   #include <algorithm>   #include <mysql>   #include "myDB.h"         using namespace std;               int main()   {        MyDB db;     db.InitDB("localhost","root","xxxxxx","Student");     db.ExeSQL("SELECT * FROM Infor;");     return 0;   }</mysql></algorithm></stack></string></iostream></mysql></algorithm></stack></string></iostream></mysql></iostream></string>

以下是运行结果:

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

下面是遇到的问题:
1. 编译时出错
没有那个文件或目录 

#include<mysql>   ^</mysql>

编译中断。
解决:除了mysql-client和mysql-server,又c了mysql-devel,然后就解决了。

2. 自定义的c传入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 

© 版权声明
THE END
喜欢就支持一下吧
点赞14 分享