要給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 Files\MySQL\MySQL Connector C++ 1.1.8\include
這一步是為了讓我們的C++程序可以引用連接sql相關的頭文件。
3.3 添加額外的庫目錄
接着是 項目屬性 => 鏈接器 => 輸入 => 附加依賴庫
同樣的方法,路徑是C:\Program Files\MySQL\MySQL Connector C++ 1.1.8\lib\opt
這一步使得.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的靜態庫
-
我遇到的問題是報錯說<my_global.h>的
timespec
已經定義了,於是在
#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.lib
,libmysql.lib
; -
libmysql.lib
的目錄C:\Program Files\MySQL\MySQL Server 5.7\lib
要填在 Configuration Properties => Linker => General => Additional Library directories中。
如果是動態庫,則:
- 在 項目屬性 => 鏈接器 => 輸入 => 附加依賴庫中添加
mysqlcppconn.lib
- 把
C:\Program Files\MySQL\MySQL Connector C++ 1.1.8\lib\opt
下的mysqlcppconn.dll復制到我們的windows\system32目錄下或者項目根目錄\x64\Release
下。
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:\local\boost_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 << "\t... MySQL replies: ";
/* 獲取某列屬性值通過列名 */
cout << res->getString("_message") << endl;
cout << "\t... 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