VS2013通过MySQL ConnectorC++操作数据库

最近项目中需要连接和操作mysql数据库,所以研究了下c++连接mysql数据库的方法。

C++连接mysql数据库的方式有很多,1)使用mysql API连接;2)通过ADO连接;3)通过MySQL官方提供的MySQL Connector/C++连接。

小编由于使用的是c++编程环境,且在MySQL官网提供的Connectors中发现了MySQL Connector/C++(认为官网提供的应该比较靠谱)。所以选择了MySQL Connector/C++方式连接数据库。

 MySQL Connector/C++是由Sun Microsystems开发的MySQL连接器。它提供了基于OO的编程接口与数据库驱动来操作MySQL服务器。与许多其他现存的C++接口实现不同,Connector/C++遵循了JDBC规范。也就是说,Connector/C++ Driver的API主要是基于Java语言的JDBC接口。JDBC是java语言与各种数据库连接的标准工业接口。Connector/C++实现了大部分JDBC4.0规范。如果C++程序的开发者很熟悉JDBC编程,将很快的入门。

OK,在正式开讲之前,小编假设大伙的MySQL服务已经安装运行并能从客户端访问,下面进入正题~

1、下载MySQL Connector/C++

去MySQL官网下载MySQL connector/C++,下载地址https://dev.mysql.com/downloads/connector/cpp/

可以下载zip版本,也就是免安装版(推荐)。你也可以下载msi版本,也就是安装版。还可以下载源码自己编译。

根据自己系统平台下载相应的版本。根据官方建议:最好使用和编译MySQLConnector相同的vs版本来开发使用,不然可能会出现很多预想不到的问题。(这个小编进行了下尝试,在文章末尾列举了下预想不到的问题 ( ─━ _ ─━✧))

小编使用的vs版本是2013,根据官方说明(如下),所以下载的MySQLConnector版本是1.1.9,免安装版。

下载完成后,解压,可以看到目录中有include、lib两个文件夹。

include\中是头文件;

lib\中包含DLL版本(动态)库和LIB版本(静态)库。

  • mysqlcppconn.dll 、mysqlcppconn.lib是动态库的文件;
  • mysqlcppconn-static.lib是静态库.

   

2、准备好boost库

由于Connector/C++库中使用了boost库的接口,所以在我们的应用程序中需要包含boost库目录。

可以到https://www.boost.org/users/download/下载boost, 或者去SourceForge上下载:https://sourceforge.net/projects/boost/files/boost/

也可以下载源码自己编译,具体过程这里不详细描述。。。( ̄^ ̄゜)(童鞋们可以看这个帖子:https://blog.csdn.net/lt4959/article/details/108974041

......

......

小编编译好了boost-1.58库。

3、使用Connector/C++操作数据库连接

在VS中新建一个控制台项目TestMySQL,然在项目中设置包含的文件和库(如下图),小编这里使用的32bit版本,童鞋们请根据自己的需要来配置。

附加包含目录中添加boost库目录和ConnectorC++库目录。(PS. 小编已将boost库目录配置成了环境变量,所以可以直接通过环境变量名配置。 = ̄ω ̄=)

附加库目录中添加ConnectorC++库目录

附加依赖项添加ConnectorC++库,

  • 使用静态库,依赖项中添加mysqlcppconn-static.lib

  • 使用动态库,依赖项中添加mysqlcppconn.lib,同时需要把mysqlcppconn.dll拷贝到TestMySQL项目的输出路径中

注意:若使用静态库,还需要定义宏CPPCONN_LIB_BUILD,否则头文件会按照动态库的方式去导入函数,导致报一堆错(见问题二

可以在包含头文件前定义宏CPPCONN_LIB_BUILD,或者在预处理器定义中添加。

4、编写测试代码

(PS. 小编已在数据库中新建了一个名为“my_test”的database)


#include "stdafx.h"

/*
Include directly the different
headers from cppconn/ and mysql_driver.h + mysql_util.h
(and mysql_connection.h). This will reduce your build time!
*/
#include <jdbc/mysql_connection.h>

#include <jdbc/cppconn/driver.h>
#include <jdbc/cppconn/exception.h>
#include <jdbc/cppconn/resultset.h>
#include <jdbc/cppconn/statement.h>

#include <iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	try {
		sql::Driver *driver;
		sql::Connection *con;
		sql::Statement *stmt;
		sql::ResultSet *res;

		/* Create a connection */
		driver = get_driver_instance();
		con = driver->connect("tcp://127.0.0.1:3306", "root", "ahdms520");
		if (con == NULL)
		{
			cout << "conn is null" << endl;
			goto END;
		}
		cout << "连接数据库服务器成功" << endl;

		/* Connect to the MySQL test database */
		con->setSchema("my_test");

		stmt = con->createStatement();
		if (stmt == NULL)
		{
			cout << "stmt is null" << endl;
			goto END;
		}

		res = stmt->executeQuery("SELECT * FROM `user`;");
		int i = 0;
		while (res->next()) {
			// You can use either numeric offsets...
			cout << "id = " << res->getInt(1); // getInt(1) returns the first column
			// ... or column names for accessing results.
			// The latter is recommended.
			cout << ", name = '" << res->getString("name").c_str() << "'" << endl;
			i++;
		}
		cout << "共" << i << "条" << endl;

		con->close();
		delete res;
		delete stmt;
		delete con;
	}
	catch (sql::SQLException& e) 
	{
		std::cout << "# ERR: " << e.what();
		std::cout << " (MySQL error code: " << e.getErrorCode();
		std::cout << ", SQLState: " << e.getSQLState() << " )" << std::endl;
	}
END:
	system("pause");

	return 0;
}

编译运行结果:

(๑╹ヮ╹๑)ノ Studying makes me happy

/**********************************华丽分割线ლ(❛◡❛✿)ლ**************************************/

下面列举一下小编在研究过程中趟过的坑~

问题一

从MySQL官网下载的Zip包中只有release版本库。若在VS的debug模式中使用其LIB(静态)库,会报一堆错误,如下,

错误 1 error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“0”不匹配值“2”(TestMySQL.obj 中) E:\workspace\MyTest\TestMySQL\TestMySQL\mysqlcppconn-static.lib(mysql_driver.obj) TestMySQL

意思是当前工程是Debug版本,而引用的库文件时Release版本,从而导致不匹配。所以把当前的Debug模式改成Release模式就可以了

参考:https://www.cnblogs.com/lisuyun/p/6410393.html

童鞋们放心,使用DLL(动态)库不会有这个问题的。O(∩_∩)O

问题二

若使用静态库时,编译报如下错误。那么应该是没有定义CPPCONN_LIB_BUILD宏,程序按照动态库的方式去导入了函数。

错误 14 error LNK1120: 6 个无法解析的外部命令 E:\workspace\MyTest\TestMySQL\Release\TestMySQL.exe TestMySQL

错误 8 error LNK2001: 无法解析的外部符号 "__declspec(dllimport) class sql::mysql::MySQL_Driver * __cdecl sql::mysql::get_driver_instance(void)" (__imp_?get_driver_instance@mysql@sql@@YAPAVMySQL_Driver@12@XZ) E:\workspace\MyTest\TestMySQL\TestMySQL\TestMySQL.obj TestMySQL

错误 13 error LNK2001: 无法解析的外部符号 "__declspec(dllimport) public: __thiscall sql::SQLString::~SQLString(void)" (__imp_??1SQLString@sql@@QAE@XZ) E:\workspace\MyTest\TestMySQL\TestMySQL\TestMySQL.obj TestMySQL

错误 12 error LNK2001: 无法解析的外部符号 "__declspec(dllimport) public: __thiscall sql::SQLString::SQLString(char const * const)" (__imp_??0SQLString@sql@@QAE@QBD@Z) E:\workspace\MyTest\TestMySQL\TestMySQL\TestMySQL.obj TestMySQL

错误 11 error LNK2001: 无法解析的外部符号 "__declspec(dllimport) public: char const * __thiscall sql::SQLString::c_str(void)const " (__imp_?c_str@SQLString@sql@@QBEPBDXZ) E:\workspace\MyTest\TestMySQL\TestMySQL\TestMySQL.obj TestMySQL

错误 10 error LNK2001: 无法解析的外部符号 "__declspec(dllimport) public: class std::basic_string,class std::allocator > const & __thiscall sql::SQLException::getSQLState(void)const " (__imp_?getSQLState@SQLException@sql@@QBEABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ) E:\workspace\MyTest\TestMySQL\TestMySQL\TestMySQL.obj TestMySQL

错误 9 error LNK2001: 无法解析的外部符号 "__declspec(dllimport) public: int __thiscall sql::SQLException::getErrorCode(void)const " (__imp_?getErrorCode@SQLException@sql@@QBEHXZ) E:\workspace\MyTest\TestMySQL\TestMySQL\TestMySQL.obj TestMySQL

解决办法:在预处理器定义中添加CPPCONN_LIB_BUILD宏定义.

参考:https://www.cnblogs.com/sankeyou/p/4054472.html

问题三

在执行完查询语句后通过getString获取varchar字段的值时,会因为内存异常而崩溃

解决办法:通过如下方式获取varchar字段值,

res->getString("Column name").c_str();

参考:https://stackoverflow.com/questions/4822958/mysql-c-connector-getstring-doesnt-work-correctly-while-getint-works-perfe

问题四

若是VS2013中使用MySQL Connector/C++ 8.0.21(即采用的是vs2019编译的版本)静态库,

编译后,提示如下一堆错误 ฺ(▼ヘ▼#)

sorry,这个坑小编也爬不出来。还是建议童鞋们使用合适的版本吧。ㄟ( ▔, ▔ )ㄏ  

(PS.有知道这个问题的朋友欢迎来告诉小编(^_-))

猜你喜欢

转载自blog.csdn.net/lt4959/article/details/109055284