MySQL官网上C++的API有两个。一个是很成熟的MySQL++,据说用了很多年了经历了若干变化,深受好评;另一个MySQL Connector/C++,近两年才出的,模仿JDBC做的,封装得很方便使用。下面分别讲这两种方式。


MySQL++方式

操作系统:win7-64bit 

数据库:MySQL Server 5.6

Microsoft Visual Studio Ultimate 2013 


1、新建工程
2、添加相应的包含目录和库目录


将文件夹MySQL Server 5.6中include添加到VC++目录中的包含目录中,将文件夹MySQL Server 5.6中的lib添加到VC++目录中的库目录中。


点击菜单栏中“项目”,选择“XXX属性”,就会出现以下对话框



vs2010连接mysql数据库 vs与mysql连接_vs2010连接mysql数据库




3、添加附加依赖项


将MySQL Server 5.6\lib中的libmysql.lib添加到链接器——输入——附加依赖项中




vs2010连接mysql数据库 vs与mysql连接_c++_02




4、修改运行平台


由于系统是64位的,故mysql也是64位的,而我们创建的工程是win32控制平台程序,无法直接使用64位的libmysql.lib。


因为我已经调整好,故下面图中的活动平台已经为x64平台,默认活动平台为win32


vs2010连接mysql数据库 vs与mysql连接_mysql_03


vs2010连接mysql数据库 vs与mysql连接_vs2010连接mysql数据库_04


vs2010连接mysql数据库 vs与mysql连接_数据库_05



在下拉菜单中选择x64 


5、将MySQL\MySQL Server 5.6\lib中的libmysql.dll,libmysql.lib拷到所建工程的debug文件夹下,并将libmysql.dll拷到system32和syswow64这两个系统文件夹下


测试程序:

    1. #include<WinSock2.h>  
    2. #include<winsock.h>  
    3. #include<mysql.h>  
    4. #include<iostream>  
    5. using namespace std;  
    6. int main()  
    7. {  
    8.     MYSQL mysql;  
    9.     mysql_init(&mysql);  
    10. if (!mysql_real_connect(&mysql, "localhost", "root", "131370", "xiedb", 3306, NULL, 0))  
    11. "数据库连接失败" << endl;  
    12. else  
    13. "数据库连接成功" << endl;  
    14.   
    15. return 0;  
    16. }


    其中root表示当前mysql的用户名,131370表示当前数据库的密码,xiedb表示当程序所连接的数据库,3306表示端口号。(均是本人所用的参数)


    结果如下:




    vs2010连接mysql数据库 vs与mysql连接_vs2010连接mysql数据库_06




    MySQL Connector/C++




    首先去MySQL官网下载MySQL connector/C++

    http://dev.mysql.com/downloads/connector/cpp/1.0.html

    下载第二个包,windows32位非安装版(个人觉得这个包干净)。目前的版本是Connector/C++ 1.0.5。
    Windows (x86, 32-bit), ZIP Archive (mysql-connector-c++-noinstall-1.0.5-win32.zip)

    将整个包解压到项目文件夹下的的源文件目录。文件夹名字太长,将“mysql-connector-c++-noinstall-1.0.5-win32”改为“mysql”。

    下面要配置vs2008的环境。

    64位系统需要修改运行平台,见上面方法的第4个步骤

    1. 项目属性页->C/C++->General->Additional Include Directories。将mysql/include目录和mysql/include/cppconn目录添加进去。

    2. 项目属性页->Linker->General->Additional Library Directories。将mysql/lib目录添加进去。

    3. 项目属性页->Linker->Input->Additional Dependencies。添加这两项mysqlcppconn.lib,mysqlcppconn-static.lib(mysql/lib目录下的两个.lib文件)

    4. 将mysql/lib下的mysqlcppconn.dll文件复制到windows/system32文件夹下。

    环境配置完毕。

     

    在连接数据库之前,先建立一张表。 (其实这些可以在代码中完成,我这样是为了让测试代码尽可能简练易查错)

    打开控制台,输入mysql -u root -p,输入密码。

    查看当前已有的数据库。(SQL语句末尾加上';'表示立即执行当前语句。)
    mysql> show databases;

    创建数据库
    mysql> create database test;

    使用数据库(这句不能加分号)
    mysql> use test

    查看已有的表
    mysql> show tables;

    创建表
    mysql> create table testuser ( id INT, name CHAR(20));

    插入数据
    mysql> insert into testuser(id, name) values(1001, 'google');
    mysql> insert into testuser(id, name) values(1002, 'kingsoft');
    mysql> insert into testuser(id, name) values(1003, 'firefox');

     

    现在在C++中查询这些数据



    1. #include "stdafx.h"  
    2. #include <mysql_connection.h>  
    3. #include <mysql_driver.h>  
    4. #include <statement.h>  
    5. using namespace sql;  
    6. using namespace std;  
    7. void RunConnectMySQL()   
    8. {  
    9.     mysql::MySQL_Driver *driver;  
    10.     Connection *con;  
    11.     Statement *state;  
    12.     ResultSet *result;  
    13. // 初始化驱动  
    14.     driver = sql::mysql::get_mysql_driver_instance();  
    15. // 建立链接  
    16. "tcp://127.0.0.1:3306", "root", "123");  
    17.     state = con->createStatement();  
    18. "use test");  
    19. // 查询  
    20. "select * from testuser where id < 1002");  
    21. // 输出查询  
    22. while(result->next())  
    23.     {  
    24. int id = result->getInt("ID");  
    25. "name");  
    26. " : " << name << endl;  
    27.     }  
    28. delete state;  
    29. delete con;  
    30. }  
    31. int _tmain(int argc, _TCHAR* argv[])  
    32. {  
    33.     RunConnectMySQL();  
    34.     getchar();  
    35. return 0;  
    36. }

    这种方法编译的时候可能出现某个int_8类型重定义的现象,直接注释掉就可以了。

    另外在使用的时候,上面这段代码,输出查询字符串的name的时候,运行出错。只查询输出数值类型是没有问题的,不知道是什么原因。