项目需要,需要用c++连接mysql数据库,这里是官方给出的在VS下的连接步骤:http://dev.mysql.com/doc/refman/5.6/en/connector-cpp-apps-windows-visual-studio.html
但我在连接过程中,发现官网给出的步骤有些问题,现总结我的连接步骤如下,同时指出官网连接教程中的一些出入。
1、下载安装mysql(http://dev.mysql.com/downloads/),安装时注意最好选择安装Connect/c++。严格来说等到后面再在官网下载单独的Connect/c++安装也行,但我自己安装过程中发现,在官网中下载的Connect/c++的zip免安装版,解压后里面没有“lib\opt”这个文件夹,而这个里面的内容是我们后续连接要用的。若下载Connect/c++的.msi安装版本也存在同样的问题。
2、下载并解压缩boost库(http://www.boost.org/),mysql Connect/c++ 里用到了智能指针,所以需要boost库。当然,你也可以注释掉Connect/c++里相关头文件里用到boost库的地方,这样就不用智能指针了,不过建议最好保留。
3、下面就是相关的环境设置,假设mysql安装目录为C:\Program Files\MySQL; 而boost库的目录为C:\Program Files\boost_1_54_0。我只设置成功了动态链接的配置,静态链接下我没试成。
动态链接
动态链接的debug设置和release设置是相同的,具体如下:
(1)项目属性页,“c/c++”-"常规"-“附加包含目录”添加相关头文件路径:
C:\Program Files\boost_1_54_0
C:\Program Files\MySQL\Connector C++ 1.1.3\include
(2)项目属性页,“链接器”-“常规”-“附加库目录”添加库文件mysqlcppconn.lib的路径
C:\Program Files\MySQL\Connector C++ 1.1.3\lib\opt
“链接器”-“输入”-“附加依赖项”添加库文件
mysqlcppconn.lib
(3)将目录C:\Program Files\MySQL\Connector C++ 1.1.3\lib\opt下的文件mysqlcppconn.dll(1.1.3版本,该文件大小为582KB),以及目录C:\Program Files\MySQL\MySQL Server 5.6\lib下的文件libmysql.dll,拷贝到工程的debeg(或者release)目录下。
通过以上步骤,就完成了c++动态链接mysql的基本环境配置,可在官网找相关示例(http://dev.mysql.com/doc/refman/5.6/en/connector-cpp-examples-complete-example-1.html)直接测试。
和官网给出的步骤的不同点:
(1)官网是要求在附加包含目录和附加库目录里分别添加路径C:\Program Files\MySQL\MySQL Server 5.6\include和路径C:\Program Files\MySQL\MySQL Server 5.6\lib,附加依赖项添加libmysql.lib。但我试验过,确实不需要。c++连接mysql的相关头文件都在路径C:\Program Files\MySQL\Connector C++ 1.1.3\include下,并不需要再添加C:\Program Files\MySQL\MySQL Server 5.6\include下的头文件。此外,运行只需要动态连接libmysql.dll库即可,编译的时候并不需要添加libmysql.lib。
(2)官网debug和release的配置是不同的,具体分别在附加库目录,debug是添加路径C:\Program Files\MySQL\Connector C++ 1.1.3\lib\debug,而release是C:\Program Files\MySQL\Connector C++ 1.1.3\lib\opt,同时debug下拷贝mysqlcppconn.dll也是拷贝路径C:\Program Files\MySQL\Connector C++ 1.1.3\lib\debug下的那个mysqlcppconn.dll文件(1.1.3版本下该文件为966KB),但我试验发现,这样设置debug版本是不能正常运行的。一个奇葩的地方是,我附加库目录用C:\Program Files\MySQL\Connector C++ 1.1.3\lib\debug,但mysqlcppconn.dll是拷贝C:\Program Files\MySQL\Connector C++ 1.1.3\lib\opt下的文件mysqlcppconn.dll(1.1.3版本,该文件大小为582KB),却能正常运行。。完全石化了
静态链接
静态链接,区别就是不需要拷贝mysqlcppconn.dll到工程目录,同时将附加依赖项mysqlcppconn.lib改为mysqlcppconn-static.lib,另外需要在”c/c++“-"预处理器"-”预处理器定义“中添加一行”CPPCONN_PUBLIC_FUNC=
“,但我按照上面这些做了,还是出现无法解析相关库函数的链接错误,不明所以。有待以后有空慢慢研究。
附上测试代码
#include "stdafx.h"
#include <mysql_connection.h>
#include <cppconn/driver.h>
#include <cppconn/exception.h>
#include <cppconn/resultset.h>
#include <cppconn/statement.h>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
try {
sql::Driver *driver;
sql::Connection *con;
sql::Statement *stmt;
sql::ResultSet *res;
sql::PreparedStatement *pstmt;
driver = get_driver_instance();
con = driver->connect("localhost", "user_name", "password");
//选择要连接的数据库
con->setSchema("test");
//设置字符格式
con->setClientOption("characterSetResults", "utf8");
stmt = con->createStatement();
res = stmt->executeQuery("SELECT * from user");
//遍历结果集
while (res->next())
{
//这里的ID是user表中的字段名
int id = res->getInt("ID");
cout<<id<<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;
}
return 0;
}