MySQL数据库使用——MySQL在C/C++的API接口

直接操作MySQL,输入命令效率低,将MySQL嵌入程序中,封装接口,让程序去访问MySQL,才能最大效益利用MySQL。

MySQL C API移植

包含MySQL的工程文件不应直接关联电脑已安装的MySQL,因为不同电脑服务器安装的位置不一样,每次移植都需要重新部署安装环境。应该将MySQL的头文件以及操作的库文件一并拷贝到工程文件中,这样即使移植到别的安装有MySQL电脑或服务器,就不需要重新定位头文件以及相关的库文件,直接操作访问数据库。除非随着MySQL的版本升级导致接口参数改变,否则就可以直接利用。
移植之后即使设备没装MySQL也可以编译代码,只是没有MySQL不能运行而已,工程不因设备未MySQL而不能编译通过。

移植MySQL头文件

在linux中构建的Makefile工程要安装libmysqlclient-dev才能使用API接口的头文件。
命令:sudo apt-get install libmysqlclient-dev

安装好后的头文件在:/usr/include/mysql

ghost@ghost-machine:/usr/include$ ls mysql/
big_endian.h                my_global.h             plugin_audit.h
binary_log_types.h          my_list.h               plugin_auth_common.h
byte_order_generic.h        mysql                   plugin_ftparser.h
byte_order_generic_x86.h    mysql_com.h             plugin_group_replication.h
decimal.h                   mysql_com_server.h      plugin.h
errmsg.h                    mysqld_ername.h         plugin_keyring.h
keycache.h                  mysqld_error.h          plugin_validate_password.h
little_endian.h             mysql_embed.h           psi
m_ctype.h                   mysql.h                 sql_common.h
m_string.h                  mysql_time.h            sql_state.h
my_alloc.h                  mysql_version.h         sslopt-case.h
my_byteorder.h              mysqlx_ername.h         sslopt-longopts.h
my_command.h                mysqlx_error.h          sslopt-vars.h
my_compiler.h               mysqlx_version.h        thr_cond.h
my_config.h                 my_sys.h                thr_mutex.h
my_dbug.h                   my_thread.h             thr_rwlock.h
my_dir.h                    my_thread_local.h       typelib.h
my_getopt.h                 my_xml.h

Windows的MySQL头文件即在安装目录里面。

MySQL头文件:C:\Program Files\MySQL\MySQL Server 5.7\include\
C++操作头文件:C:\Program Files\MySQL\Connector.C++ 1.1

windows和linux的头文件结构略有差异,但大体都是相等的,此次移植是linux的MySQL头文件。
不推荐使用C++操作头文件,因为需要用到boost库,boost库安装编译繁琐。

将头文件全部复制到工程头文件中。
命令:test_makefile/inc$ cp /usr/include/mysql/ ./ -rf

复制之后的工程头文件目录如下图所示
这里写图片描述

Makefile工程:

将头文件加入到Makefile中,编辑Makefile。

NC += -I$(DIR)/inc/mysql

Visual Studio工程

引用头文件如下图所示
这里写图片描述

移植MySQL库文件

Makefile工程

由于Makefile工程移植的库文件为.so或.a的库文件,因此一定要移植Linux下的MySQL库文件。

同头文件一样,linux要安装libmysqlclient-dev才能使用API接口的头文件。
命令:

sudo apt-get install libmysqlclient-dev

安装好后的库文件在:/usr/lib/mysql和/usr/lib下

Visual Studio工程

与Linux不同的是,Visual Studio工程移植的库文件为.lib或.dll的库文件。
库文件位置:

C:\Program Files\MySQL\MySQL Server 5.7\lib

文件位置即MySQL安装位置。
如下图所示
这里写图片描述

将库文件全部拷贝到工程库文件目录下

├── open_lib
│   ├── MySQL_lib
│   │   ├── libmysql.dll
│   │   ├── libmysql.lib
│   │   └── mysqlclient.lib

项目引用库文件,如下图所示
这里写图片描述

这里写图片描述

添加工程运行环境dll。为保证程序运行后不需要依赖系统的环境变量,需要将dll放到编译器的输出文件夹中,如定义了obj为输出文件夹,就dll放到该文件夹中。如下图所示。
这里写图片描述

添加MySQL示例

工程添加MySQL示例测试MySQL移植工程。
module_MySQL.cpp

#include "module_MySQL.h"
#include <iostream>
#include <string>
#include <mysql/mysql.h>

using namespace std;

void TestMySQL(void)
{
    cout << __FUNCTION__ << " is called." << endl;

    MYSQL mysql;
    mysql_init(&mysql);
    mysql_real_connect(&mysql, "localhost", "zxpro-admin", "qwerty", "zx_mysql", 3306, NULL, 0);

    //MySQL命令
    string sql = "select * from zx_users;";
    mysql_query(&mysql, sql.c_str());

    try
    {
        MYSQL_RES *result = mysql_store_result(&mysql);
        if (!result)
            throw string("MySQL not result!");

        //获取字段数量
        int num_fields = mysql_num_fields(result);
        if(0 == num_fields)
            throw string("MySQL fields number is 0!");

        //获取字段名
        MYSQL_FIELD *fields = mysql_fetch_fields(result);
        if (!fields)
            throw string("MySQL fields fetch is error!");

        for (int i = 0; i < num_fields; i++)
        {
            cout << "field " << i << " name is " << fields[i].name << endl;
        }

        cout << "MySQL is OK." << endl;
    }
    catch (string &error_msg)
    {
        cout << error_msg << endl;
    }
    catch (...)
    {
        cout << "MySQL operation is error!" << endl;
    }

    mysql_close(&mysql);
}

数据库结构下图所示。
这里写图片描述

示例工程运行结果如下图所示。
这里写图片描述

MySQL C API

官方文档:https://dev.mysql.com/doc/refman/5.7/en/c-api.html

头文件包含

要使用MySQL的接口API,需要包含头文件

#include <mysql/mysql.h>

登录MySQL:mysql_init(),mysql_real_connect()

函数原型:

MYSQL * STDCALL mysql_init(MYSQL *mysql);
//成功返回*mysql指针,失败返回NULL。

MYSQL * STDCALL mysql_real_connect(MYSQL *mysql, 
                                const char *host,   //MySQL的IP,远程登录输入远程登录的IP地址
                                const char *user,   //登录用户
                                const char *passwd, //登录密码
                                const char *db,     //使用的数据库名称
                                unsigned int port,  //MySQL端口
                                const char *unix_socket,    //是否使用socket机制登录,NULL:否
                                unsigned long clientflag);  //连接标志,通常为0

//成功返回*mysql指针,失败返回NULL。

clientflag连接标志在文件:mysql_com.h 以#define CLIENT_*定义
以下截取片段:

  • 33
    点赞
  • 150
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值