linux下C++与数据库连接


前言

大家学完了MYSQL数据库应该有个疑惑:我们学SQL语句是为了保存一些用户的信息,但是大部分教程都只是讲解SQL语句,而没有讲解如何将SQL语句与编程语言相连接,那如何将我们所学的数据库与编程语言连接呢?
其实主流的编程语言如C/C++,java,python等都有与数据库相连的API,我们可以通过相关的API文档来学习编程语言和MYSQL数据库连接。
下面来介绍几个小demo来入门Linux下C++与MYSQL的编程。


提示:以下是本篇文章正文内容,下面案例可供参考

一、本文中可能用到的API

1.头文件
#include <mysql/mysql.h>

2.MYSQL *mysql_init(MYSQL *mysql)

描述
分配或初始化与mysql_real_connect()相适应的MYSQL对象。如果mysql是NULL指针,该函数将分配、初始化、并返回新对象。否则,将初始化对象,并返回对象的地址。如果mysql_init()分配了新的对象,当调用mysql_close()来关闭连接时。将释放该对象。
返回值
初始化的MYSQL*句柄。如果无足够内存以分配新的对象,返回NULL。

3.int mysql_options(MYSQL *mysql, enum mysql_option option, const char *arg)

描述
可用于设置额外的连接选项,并影响连接的行为。可多次调用该函数来设置数个选项。应在mysql_init()之后、以及mysql_connect()或mysql_real_connect()之前调用mysql_options()。选项参量指的是你打算设置的选项。Arg参量是选项的值。如果选项是整数,那么arg应指向整数的值
返回值
成功时返回0。如果使用了未知选项,返回非0值。

4.int mysql_create_db(MYSQL *mysql, const char *db)

描述
创建由db参数命名的数据库。 该函数已过时。最好使用mysql_query()来发出SQL CREATE DATABASE语句。
返回值
如果数据库已成功创建,返回0,如果出现错误,返回非0值。

5.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_real_connect()尝试与运行在主机上的MySQL数据库引擎建立连接。在你能够执行需要有效MySQL连接句柄结构的任何其他API函数之前,mysql_real_connect()必须成功完成。
注释:
调用mysql_real_connect()之前,不要尝试加密密码,密码加密将由客户端API自动处理。 ·
“db”是数据库名称。如果db为NULL,连接会将默认的数据库设为该值。 ·
如果“port”不是0,其值将用作TCP/IP连接的端口号。注意,“host”参数决定了连接的类型。 ·
如果unix_socket不是NULL,该字符串描述了应使用的套接字或命名管道。
client_flag的值通常为0,但是,也能将其设置为其他标志的组合

返回值

如果连接成功,返回MYSQL*连接句柄。如果连接失败,返回NULL。对于成功的连接,返回值与第1个参数的值相同。

6.int mysql_select_db(MYSQL *mysql, const char *db)

描述
使由db指定的数据库成为由mysql指定的连接上的默认数据库(当前数据库)。在后续查询中,该数据库将是未包含明确数据库区分符的表引用的默认数据库。
除非已连接的用户具有使用数据库的权限,否则mysql_select_db()将失败。
返回值
0表示成功,非0值表示出现错误。

7.int mysql_real_query(MYSQL *mysql, const char *query, unsigned long length)

描述
执行由“query”指向的SQL查询,它应是字符串长度字节“long”。正常情况下,字符串必须包含1条SQL语句,而且不应为语句添加终结分号(‘;’)或“\g”。如果允许多语句执行,字符串可包含由分号隔开的多条语句。
对于包含二进制数据的查询,必须使用mysql_real_query()而不是mysql_query(),这是因为,二进制数据可能会包含‘\0’字符。此外,mysql_real_query()比mysql_query()快,这是因为它不会在查询字符串上调用strlen()。
如果希望知道查询是否应返回结果集,可使用mysql_field_count()进行检查。
返回值
如果查询成功,返回0。如果出现错误,返回非0值。

8.const char *mysql_error(MYSQL *mysql)

描述
对于由mysql指定的连接,对于失败的最近调用的API函数,mysql_error()返回包含错误消息的、由Null终结的字符串。如果该函数未失败,mysql_error()的返回值可能是以前的错误,或指明无错误的空字符串。
经验规则是,如果成功,所有向服务器请求信息的函数均会复位mysql_error()。
返回值
返回描述错误的、由Null终结的字符串。如果未出现错误,返回空字符串。 错误 无。

9.MYSQL_RES *mysql_store_result(MYSQL *mysql)

描述
对于成功检索了数据的每个查询(SELECT、SHOW、DESCRIBE、EXPLAIN、CHECK
TABLE等),必须调用mysql_store_result()或mysql_use_result() 。
对于其他查询,不需要调用mysql_store_result()或mysql_use_result(),但是如果在任何情况下均调用了mysql_store_result(),它也不会导致任何伤害或性能降低。通过检查mysql_store_result()是否返回0,可检测查询是否没有结果集(以后会更多)。
如果希望了解查询是否应返回结果集,可使用mysql_field_count()进行检查。
mysql_store_result()将查询的全部结果读取到客户端,分配1个MYSQL_RES结构,并将结果置于该结构中。
如果查询未返回结果集,mysql_store_result()将返回Null指针(例如,如果查询是INSERT语句)。
如果读取结果集失败,mysql_store_result()还会返回Null指针。通过检查mysql_error()是否返回非空字符串,mysql_errno()是否返回非0值,或mysql_field_count()是否返回0,可以检查是否出现了错误。
如果未返回行,将返回空的结果集。(空结果集设置不同于作为返回值的空指针)。
一旦调用了mysql_store_result()并获得了不是Null指针的结果,可调用mysql_num_rows()来找出结果集中的行数。
可以调用mysql_fetch_row()来获取结果集中的行,或调用mysql_row_seek()和mysql_row_tell()来获取或设置结果集中的当前行位置。
一旦完成了对结果集的操作,必须调用mysql_free_result()。
返回值
具有多个结果的MYSQL_RES结果集合。如果出现错误,返回NULL。

10.MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)

描述
检索结果集的下一行。在mysql_store_result()之后使用时,如果没有要检索的行,mysql_fetch_row()返回NULL。在mysql_use_result()之后使用时,如果没有要检索的行或出现了错误,mysql_fetch_row()返回NULL。
行内值的数目由mysql_num_fields(result)给出。如果行中保存了调用mysql_fetch_row()返回的值,将按照row[0]到row[mysql_num_fields(result)-1],访问这些值的指针。行中的NULL值由NULL指针指明。
可以通过调用mysql_fetch_lengths()来获得行中字段值的长度。对于空字段以及包含NULL的字段,长度为0。通过检查字段值的指针,能够区分它们。如果指针为NULL,字段为NULL,否则字段为空。
返回值
下一行的MYSQL_ROW结构。如果没有更多要检索的行或出现了错误,返回NULL。(其实就是一个二维数组)

二、C++连接数据库API的使用

1.连接数据库和创建数据库

代码如下(示例):

//连接数据库
bool connectDB(MYSQL& mysql)
{
    //初始化文件句柄
    mysql_init(&mysql);
    //设置字符编码
    mysql_options(&mysql,MYSQL_SET_CHARSET_NAME,"utf8");
    //连接数据库
    MYSQL* ret=mysql_real_connect(&mysql,"localhost","root","****",NULL,3306,NULL,0);
    if(ret==NULL)
    {
        cout<<"数据库连接失败!原因:"<<mysql_error(&mysql)<<endl;
        return false;
    }
    else cout<<"数据库连接成功!"<<endl;
    return true;
}


bool createDB(const char* newDB_name)
{
    MYSQL mysql;//数据库句柄
    char sql[SQL_MAX];//sql语句
    //连接数据库
    if(!connectDB(mysql))return false;
    //c语言组合字符串
    snprintf(sql,SQL_MAX,"create database %s ;",newDB_name);
    cout<<"创建数据库语句:"<<sql<<endl;
    //执行语句,成功返回0
    int ret=mysql_real_query(&mysql,sql,(unsigned long)strlen(sql));
    cout<<"创建数据库语句返回结果:"<<ret<<endl;
    if(ret)
    {
        cout<<"数据库创建失败,原因:"<<mysql_error(&mysql)<<endl;
        return false;
    }
    cout<<"数据库创建成功!"<<endl;
    mysql_close(&mysql);
    return true;
}

执行两次createDB:

第一次执行结果:
在这里插入图片描述
第二次执行结果:
在这里插入图片描述

2.选择数据库

代码如下(示例):

//选择数据库
bool useDB(MYSQL& mysql,const char* DB_name)
{
    char sql[SQL_MAX];
    snprintf(sql,SQL_MAX,"use %s;",DB_name);
    cout<<"数据库选择语句:"<<sql<<endl;
    //执行语句,成功返回0
    int ret=mysql_real_query(&mysql,sql,(unsigned long)strlen(sql));
    cout<<"数据库选择语句返回结果:"<<ret<<endl;
    if(ret)
    {
        cout<<"数据库选择失败,原因:"<<mysql_error(&mysql)<<endl;
        return false;
    }
    cout<<"数据库选择成功!"<<endl;
    return true;
}

执行结果:在这里插入图片描述

3.创建表结构

bool createTB(MYSQL& mysql,const char* sql)
{
    int ret=mysql_real_query(&mysql,sql,(unsigned long)strlen(sql));
    cout<<"执行数据库表创建语句:"<<sql<<endl;
    cout<<"执行返回结果:"<<ret<<endl;
    if(ret)
    {
        cout<<"数据库表创建失败,原因:"<<mysql_error(&mysql)<<endl;
        return false;
    }
    cout<<"数据库表创建成功!"<<endl;
    return true;
}

执行结果:在这里插入图片描述

4.插入数据

bool addTableData(MYSQL& mysql, int id, const char* user_name, const char* user_password) 
{
    char sql[SQL_MAX];        // 存储语句
    // c语言字符串组合
    snprintf(sql, SQL_MAX, "INSERT INTO user VALUES (%d, '%s', '%s');", id, user_name, user_password);
    cout << "插入 sql 语句:" << sql << endl;
    int ret = mysql_real_query(&mysql, sql, (unsigned long)strlen(sql));
    cout << "执行插入语句,插入返回结果:" << ret << endl;
    if (ret) {
        cout << "插入表数据失败!失败原因:" << mysql_error(&mysql) << endl;
        return false;
    }
    cout << "插入数据成功!" << endl;
    return true;
}

执行结果:在这里插入图片描述在这里插入图片描述

5.修改数据类型

//修改数据类型
bool alterTableDataType(MYSQL& mysql,char* name,char *newDataType)
{
    char sql[SQL_MAX];//sql语句
    //c语言组合字符串
    snprintf(sql,SQL_MAX,"alter table user modify %s %s;",name,newDataType);
    cout << "修改类型 sql 语句:" << sql << endl;
    //执行类型修改语句,成功返回0
    int ret=mysql_real_query(&mysql,sql,(unsigned long)strlen(sql));
    cout<<"执行修改类型语句,修改返回结果:"<<ret<<endl;
    if(ret){
        cout<<"数据类型修改失败:失败原因:"<<mysql_error(&mysql)<<endl;
        return false;
    }
    cout<<"数据类型修改成功!"<<endl;
    return true;

执行结果:在这里插入图片描述
在这里插入图片描述

6.查询数据表数据

bool queryTableData(MYSQL& mysql) {
    MYSQL_RES* res;     // 查询结果集
    MYSQL_ROW row;      // 记录数组
    char sql[SQL_MAX];  // SQL语句
 
 
    // C语言组合字符串
    snprintf(sql, SQL_MAX, "SELECT id, user_name, user_password FROM user;");
    cout << "查询 sql 语句:" << sql << endl;
 
    int ret = mysql_real_query(&mysql, sql, (unsigned long)strlen(sql));
    cout << "执行查询语句,查询返回结果:" << ret << endl;
 
    if (ret) {
        cout << "数据查询失败!失败原因:" << mysql_error(&mysql) << endl;
        return false;
    }
 
    cout << "数据查询成功!" << endl;
    
    // 获取结果集
    res = mysql_store_result(&mysql);
 
    while (row = mysql_fetch_row(res)) {
        cout << "用户id:" << atoi(row[0]) << "\t";  // 转换为int类型,打印id
        cout << "用户姓名:" << row[1] << "\t";      // 用户名
        cout << "用户密码:" << row[2] << endl;          // 用户密码
    }
    mysql_free_result(res);
    return true;
}

执行结果:在这里插入图片描述

7.删除表数据

//删除表数据
bool delTableData(MYSQL& mysql,int id) {
    char sql[SQL_MAX];  // 存储sql语句
    // c语言字符串组合
    snprintf(sql, SQL_MAX, "DELETE FROM user where id = %d;", id);
    cout << "删除 sql 语句:" << sql << endl;
    // 执行sql,成功返回0
    int ret = mysql_real_query(&mysql, sql, (unsigned)strlen(sql));
    cout << "执行删除语句,插入返回结果:" << ret << endl;
    if (ret) {
        cout << "删除表数据失败!失败原因:" << mysql_error(&mysql) << endl;
        return false;
    }
    cout << "删除表数据成功!" << endl;
    return true;
}

执行结果:在这里插入图片描述


完整代码

#include <iostream>
#include <string.h>
#include <mysql/mysql.h>
#define SQL_MAX 256
using namespace std;
bool connectDB(MYSQL& mysql);
//创建数据库
bool createDB(const char* newDB_name)
{
    MYSQL mysql;//数据库句柄
    char sql[SQL_MAX];//sql语句

    //连接数据库
    if(!connectDB(mysql))return false;

    //c语言组合字符串
    snprintf(sql,SQL_MAX,"create database  %s ;",newDB_name);
    cout<<"创建数据库语句:"<<sql<<endl;
    //执行语句,成功返回0
    int ret=mysql_real_query(&mysql,sql,(unsigned long)strlen(sql));
    cout<<"创建数据库语句返回结果:"<<ret<<endl;
    if(ret)
    {
        cout<<"数据库创建失败,原因:"<<mysql_error(&mysql)<<endl;
        return false;
    }
    cout<<"数据库创建成功!"<<endl;
    mysql_close(&mysql);
    return true;
}

//连接数据库
bool connectDB(MYSQL& mysql)
{
    //初始化文件句柄
    mysql_init(&mysql);
    //设置字符编码
    mysql_options(&mysql,MYSQL_SET_CHARSET_NAME,"utf8");
    //连接数据库
    MYSQL* ret=mysql_real_connect(&mysql,"localhost","root","****",NULL,3306,NULL,0);
    if(ret==NULL)
    {
        cout<<"数据库连接失败!原因:"<<mysql_error(&mysql)<<endl;
        return false;
    }
    else cout<<"数据库连接成功!"<<endl;
    return true;
}

//选择数据库
bool useDB(MYSQL& mysql,const char* DB_name)
{
    char sql[SQL_MAX];
    snprintf(sql,SQL_MAX,"use %s;",DB_name);
    cout<<"数据库选择语句:"<<sql<<endl;
    //执行语句,成功返回0
    int ret=mysql_real_query(&mysql,sql,(unsigned long)strlen(sql));
    cout<<"数据库选择语句返回结果:"<<ret<<endl;
    if(ret)
    {
        cout<<"数据库选择失败,原因:"<<mysql_error(&mysql)<<endl;
        return false;
    }
    cout<<"数据库选择成功!"<<endl;
    return true;
}
 

 
// 插入表数据
bool addTableData(MYSQL& mysql, int id, const char* user_name, const char* user_password) 
{
    char sql[SQL_MAX];        // 存储语句
 
    // c语言字符串组合
    snprintf(sql, SQL_MAX, "INSERT INTO user VALUES (%d, '%s', '%s');", id, user_name, user_password);
    cout << "插入 sql 语句:" << sql << endl;
 
    int ret = mysql_real_query(&mysql, sql, (unsigned long)strlen(sql));
    cout << "执行插入语句,插入返回结果:" << ret << endl;
 
    if (ret) {
        cout << "插入表数据失败!失败原因:" << mysql_error(&mysql) << endl;
        return false;
    }
 
    cout << "插入数据成功!" << endl;
    return true;
}
 
//删除表数据
bool delTableData(MYSQL& mysql,int id) {
    char sql[SQL_MAX];  // 存储sql语句

    // c语言字符串组合
    snprintf(sql, SQL_MAX, "DELETE FROM user where id = %d;", id);
    cout << "删除 sql 语句:" << sql << endl;
 
    // 执行sql,成功返回0
    int ret = mysql_real_query(&mysql, sql, (unsigned)strlen(sql));
    cout << "执行删除语句,插入返回结果:" << ret << endl;
 
    if (ret) {
        cout << "删除表数据失败!失败原因:" << mysql_error(&mysql) << endl;
        return false;
    }
 
    cout << "删除表数据成功!" << endl;
    return true;
}

//修改数据类型
bool alterTableDataType(MYSQL& mysql,char* name,char *newDataType)
{
    char sql[SQL_MAX];//sql语句


    //c语言组合字符串
    snprintf(sql,SQL_MAX,"alter table user modify %s %s;",name,newDataType);
    cout << "修改类型 sql 语句:" << sql << endl;

    //执行类型修改语句,成功返回0
    int ret=mysql_real_query(&mysql,sql,(unsigned long)strlen(sql));
    cout<<"执行修改类型语句,修改返回结果:"<<ret<<endl;
    
    if(ret){
        cout<<"数据类型修改失败:失败原因:"<<mysql_error(&mysql)<<endl;
        return false;
    }
    cout<<"数据类型修改成功!"<<endl;
    return true;
}
 
// 查询表数据
bool queryTableData(MYSQL& mysql) {
    MYSQL_RES* res;     // 查询结果集
    MYSQL_ROW row;      // 记录数组
    char sql[SQL_MAX];  // SQL语句
 
 
    // C语言组合字符串
    snprintf(sql, SQL_MAX, "SELECT id, user_name, user_password FROM user;");
    cout << "查询 sql 语句:" << sql << endl;
 
    int ret = mysql_real_query(&mysql, sql, (unsigned long)strlen(sql));
    cout << "执行查询语句,查询返回结果:" << ret << endl;
 
    if (ret) {
        cout << "数据查询失败!失败原因:" << mysql_error(&mysql) << endl;
        return false;
    }
 
    cout << "数据查询成功!" << endl;
    
    // 获取结果集
    res = mysql_store_result(&mysql);
 
    while (row = mysql_fetch_row(res)) {
        cout << "用户id:" << atoi(row[0]) << "\t";  // 转换为int类型,打印id
        cout << "用户姓名:" << row[1] << "\t";      // 打印用户姓名
        cout << "用户密码:" << row[2] << endl;          // 打印用户密码
    }
    mysql_free_result(res);
    return true;
}

bool createTB(MYSQL& mysql,const char* sql)
{
    int ret=mysql_real_query(&mysql,sql,(unsigned long)strlen(sql));
    cout<<"执行数据库表创建语句:"<<sql<<endl;
    cout<<"执行返回结果:"<<ret<<endl;
    if(ret)
    {
        cout<<"数据库表创建失败,原因:"<<mysql_error(&mysql)<<endl;
        return false;
    }
    cout<<"数据库表创建成功!"<<endl;
    return true;
}
 
int main() {
    createDB("test");
    MYSQL mysql;
    connectDB(mysql);
    useDB(mysql,"test");
    char* sql;
    sql="create table user(id int,user_name varchar(10),user_password varchar(10));";
    createTB(mysql,sql);
    addTableData(mysql,1,"lisi","4321");
    addTableData(mysql,2,"zhangsan","1234");
    alterTableDataType(mysql,"user_name","varchar(20)");
    queryTableData(mysql);
    delTableData(mysql,1);
    queryTableData(mysql);
    mysql_close(&mysql);
    return 0;

}

makefile文件:

target=test
libs=mysqlconn_test.cpp
 
$(target):$(libs)
	@$(CXX) -std=c++11 -I/usr/include/mysql -L/usr/lib64/mysql -lmysqlclient $^ -o $target
  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值