zoukankan      html  css  js  c++  java
  • 【C++】VS2015/VS2017连接Mysql数据库教程

    要给C++程序连接MySQL数据库,分别需要:

    • 安装MySQL Server
    • 下载MySQL Connector/C++
    • 在IDE中配置依赖
    • 然后就可以在代码中调用API,来连接以及操作数据库。

    一、安装MySQL Server

    这是MySQL 数据库服务,下载了它才能在自己的电脑中使用MySQL。
    下载页面:Download MySQL Installer
    参考教程: windows10上安装mysql(详细步骤)
    安装好后,我们打开MySQL 5.7 Command Line Client(在开始菜单的快捷方式里,也可以搜索一下),然后

    创建数据库
    mysql> create database test;
    
    使用数据库(这句不能加分号)
    mysql> use test
    
    查看已有的表
    mysql> show tables;
    
    创建表
    mysql> create table testuser ( id INT, name CHAR(20));
    

    二、下载MySQL Connector/C++

    这是连接MySQL的库,我们在C++中需要使用该库来连接数据库。
    下载页面:Download Connector/C++

    三、IDE中配置依赖,以Visual Studio 2015为例

    为了在我们的C++工程里方便地引用 Connector/C++库,就要配置一下项目的依赖。
    Windows10系统下编写C++工程我一般用VS,其他的IDE可以参考官方文档,如Linux中用NetBeans:Building Connector/C++ Windows Applications with Microsoft Visual Studio,以下内容也是参考文档的。

    3.1 选择编译方式

    配置依赖前,先将默认的Debug模式改为Release模式。如果修改了编译方式,配置自然就改变了。

    3.2 添加额外的Include目录

    • 在VS菜单中选择 项目属性 =>C/C++=> 输入 => 附加包含目录

    • 点击,然后选择NewLine(黄色按钮),点“...”按钮选择MySQL Connector的路径,例如我的是C:Program FilesMySQLMySQL Connector C++ 1.1.8include

    这一步是为了让我们的C++程序可以引用连接sql相关的头文件。

    3.3 添加额外的库目录

    接着是 项目属性 => 链接器 => 输入 => 附加依赖库
    同样的方法,路径是C:Program FilesMySQLMySQL Connector C++ 1.1.8libopt
    这一步使得.lib文件可以被找到。

    3.4 静态库和动态库:

    动态库与静态库优缺点比较
    接着根据我们的需要,执行后续步骤:
    如果用静态库,可能比较麻烦,因为静态库需要和编译器版本相匹配,因此需要手动编译一份,如果选择动态库可以直接跳转到3.5

    3.4.1 下载MySQL Connector/C++源码

    官方下载页面,系统选择Source Code,然后版本选择64位,下载windows对应的版本。

    3.4.2 下载安装CMake

    官方下载页面,下载最新的CMake的Windows win64-x64 Installer,安装好。

    3.4.3 在vs中编译运行支持vs2017的静态库

    #ifndef HAVE_STRUCT_TIMESPEC /* Windows before VS2015 */
    

    上面加上

    #define  HAVE_STRUCT_TIMESPEC
    

    就好了。将编译出来的xxx.lib改名为mysqlcppconn-static.lib,放到项目根目录

    3.5 添加额外的依赖

    如果是静态库,需要:

    • 在 项目属性 => C/C++=>预处理器=> 预处理中输入 CPPCONN_PUBLIC_FUNC=

    • 在 项目属性 => 链接器 => 输入 => 附加依赖库 中添加 mysqlcppconn-static.liblibmysql.lib

    • libmysql.lib 的目录 C:Program FilesMySQLMySQL Server 5.7lib 要填在 Configuration Properties => Linker => General => Additional Library directories中。

    如果是动态库,则:

    • 在 项目属性 => 链接器 => 输入 => 附加依赖库中添加 mysqlcppconn.lib

    • C:Program FilesMySQLMySQL Connector C++ 1.1.8libopt下的mysqlcppconn.dll复制到我们的windowssystem32目录下或者项目根目录x64Release下。

    3.6 下载安装boost库

    我在后续编译过程中报错说fatal error C1083: Cannot open include file: boost/shared_ptr.hpp
    原来是项目没有添加boost库的额外Include目录,而mysql_connection.h中又引用了该库。因此这一步也是需要的。
    下载地址:boost_1_64_0-msvc-14.1-64.exe
    下载安装好后, 项目属性 =>C/C++=> 输入 => 附加包含目录 中添加C:localoost_1_64_0

    四、C++连接的例子

    #include <stdlib.h>
    #include <iostream>
    
    #include "mysql_connection.h"
    
    #include <cppconn/driver.h>
    #include <cppconn/exception.h>
    #include <cppconn/resultset.h>
    #include <cppconn/statement.h>
    
    using namespace std;
    
    int main()
    {
    	cout << endl;
    	cout << "正在执行 'SELECT 'Hello World!' AS _message'..." << endl;
    
    	try {
    		sql::Driver *driver;
    		sql::Connection *con;
    		sql::Statement *stmt;
    		sql::ResultSet *res;
    
    		/* 创建连接 */
    		driver = get_driver_instance();
    		con = driver->connect("tcp://127.0.0.1:3306", "root", "pwd");
    		/* 连接 MySQL 数据库 test  */
    		con->setSchema("test");
    
    		stmt = con->createStatement();
    		res = stmt->executeQuery("SELECT 'Hello World!' AS _message");
    		while (res->next()) {
    			cout << "	... MySQL replies: ";
    			/* 获取某列属性值通过列名 */
    			cout << res->getString("_message") << endl;
    			cout << "	... MySQL says it again: ";
    			/* 通过数字偏移量, 1 代表第一列 */
    			cout << res->getString(1) << endl;
    		}
    		delete res;
    		delete stmt;
    		delete con;
    
    	}
    	catch (sql::SQLException &e) {
    		cout << "# ERR: SQLException in " << __FILE__;
    		cout << "(" << __FUNCTION__ << ") on line " << __LINE__ << endl;
    		cout << "# ERR: " << e.what();
    		cout << " (MySQL error code: " << e.getErrorCode();
    		cout << ", SQLState: " << e.getSQLState() << " )" << endl;
    	}
    
    	cout << endl;
    
    	return EXIT_SUCCESS;
    }
    

    更多操作见官方教程:Chapter 8 Connector/C++ Tutorials

  • 相关阅读:
    linux 服务发布脚本升级,远程发布,指定拉取远程dev,test等分支代码
    linux 执行脚本1.补充命令 2.后台执行
    centos7 操作防火墙
    复制目录及其子目录下所有文件DOC
    总结
    nmon监控与 nmon analyser分析
    nginx配置文服
    单字段去重 distinct 返回其他多个字段
    二维数组怎样进行遍历
    Socket与URL通信比较
  • 原文地址:https://www.cnblogs.com/flipped/p/6810216.html
Copyright © 2011-2022 走看看