要給C++程序鏈接MySQL數據庫,分別須要:html
這是MySQL 數據庫服務,下載了它才能在本身的電腦中使用MySQL。
下載頁面:Download MySQL Installer
參考教程:windows10上安裝mysql(詳細步驟)
安裝好後,咱們打開MySQL 5.7 Command Line Client(在開始菜單的快捷方式裏,也能夠搜索一下),而後mysql
建立數據庫 mysql> create database test; 使用數據庫(這句不能加分號) mysql> use test 查看已有的表 mysql> show tables; 建立表 mysql> create table testuser ( id INT, name CHAR(20));
這是鏈接MySQL的庫,咱們在C++中須要使用該庫來鏈接數據庫。
下載頁面:Download Connector/C++linux
爲了在咱們的C++工程裏方便地引用 Connector/C++庫,就要配置一下項目的依賴。
Windows10系統下編寫C++工程我通常用VS,其餘的IDE能夠參考官方文檔,如Linux中用NetBeans:Building Connector/C++ Windows Applications with Microsoft Visual Studio,如下內容也是參考文檔的。ios
配置依賴前,先將默認的Debug模式改成Release模式。若是修改了編譯方式,配置天然就改變了。
sql
C:\Program Files\MySQL\MySQL Connector C++ 1.1.8\include
這一步是爲了讓咱們的C++程序能夠引用鏈接sql相關的頭文件。數據庫
接着是 項目屬性 => 連接器 => 輸入 => 附加依賴庫
一樣的方法,路徑是C:\Program Files\MySQL\MySQL Connector C++ 1.1.8\lib\opt
這一步使得.lib文件能夠被找到。windows
動態庫與靜態庫優缺點比較
接着根據咱們的須要,執行後續步驟:
若是用靜態庫,可能比較麻煩,由於靜態庫須要和編譯器版本相匹配,所以須要手動編譯一份,若是選擇動態庫能夠直接跳轉到3.5app
在官方下載頁面,系統選擇Source Code,而後版本選擇64位,下載windows對應的版本。tcp
在官方下載頁面,下載最新的CMake的Windows win64-x64 Installer,安裝好。ide
我遇到的問題是報錯說<my_global.h>的timespec
已經定義了,因而在
#ifndef HAVE_STRUCT_TIMESPEC /* Windows before VS2015 */
上面加上
#define HAVE_STRUCT_TIMESPEC
就行了。將編譯出來的xxx.lib
更名爲mysqlcppconn-static.lib
,放到項目根目錄
若是是靜態庫,須要:
在 項目屬性 => 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
下。我在後續編譯過程當中報錯說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
#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