C++操作mysql數據庫主要有2種方式:
1、通過C++ API方式調用
2、通過mysql的Connector C++
=============================================================================================================================================
第一種方式:通過API函數來調用
一、環境配置
首先需要安裝MySQL數據庫,之后新建C++項目,添加MySQL中include文件夾的目錄。工程----->屬性---->VC++目錄---->包含目錄,比如我的本地目錄為F:\mysql\include,接着將F:\mysql\lib添加到同一頁面中的庫目錄中。
將lib文件夾中的libmysql.lib和libmysql.dll添加到本地項目中。
二、確保你安裝的數據庫和項目的解決方案平台統一,如果數據庫是64位,而項目是在win32平台下,就要將vs平台換成x64。(配置完成)
#include <stdio.h> #include <WinSock.h> //一定要包含這個 #include "include/mysql.h" //引入mysql頭文件(一種方式是在vc++目錄里面設置,一種是文件夾拷到工程目錄,然后這樣包含) #include <Windows.h> //包含附加依賴項,也可以在工程--屬性里面設置 #pragma comment(lib,"wsock32.lib") #pragma comment(lib,"libmysql.lib") MYSQL mysql; //mysql連接 MYSQL_FIELD *fd; //字段列數組 char field[32][32]; //存字段名二維數組 MYSQL_RES *res; //這個結構代表返回行的一個查詢結果集 MYSQL_ROW column; //一個行數據的類型安全(type-safe)的表示,表示數據行的列 char query[150]; //查詢語句 bool ConnectDatabase(); //函數聲明 void FreeConnect(); bool QueryDatabase1(); //查詢1 bool QueryDatabase2(); //查詢2 bool InsertData(); //增 bool ModifyData(); //改 bool DeleteData(); //刪 int main(int argc, char **argv) { ConnectDatabase(); QueryDatabase1(); InsertData(); QueryDatabase2(); ModifyData(); QueryDatabase2(); DeleteData(); QueryDatabase2(); FreeConnect(); return 0; } //連接數據庫 bool ConnectDatabase() { //初始化mysql mysql_init(&mysql); //連接mysql,數據庫 const char host[] = "localhost"; const char user[] = "root"; const char psw[] = "111111"; const char table[] = "test"; const int port = 3306; //返回false則連接失敗,返回true則連接成功 if (!(mysql_real_connect(&mysql, host, user, psw, table, port, NULL, 0)) ) //中間分別是主機,用戶名,密碼,數據庫名,端口號(可以寫默認0或者3306等),可以先寫成參數再傳進去 { printf("Error connecting to database:%s\n", mysql_error(&mysql)); return false; } else { printf("Connected...\n"); return true; } } //釋放資源 void FreeConnect() { mysql_free_result(res); //釋放一個結果集合使用的內存。 mysql_close(&mysql); //關閉一個服務器連接。 } /***************************數據庫操作***********************************/ //其實所有的數據庫操作都是先寫個sql語句,然后用mysql_query(&mysql,query)來完成,包括創建數據庫或表,增刪改查 //查詢數據 bool QueryDatabase1() { strcpy(query, "select * from user"); //執行查詢語句,這里是查詢所有,user是表名,不用加引號,用strcpy也可以 mysql_query(&mysql, "set names gbk"); //設置編碼格式(SET NAMES GBK也行),否則cmd下中文亂碼 //返回0 查詢成功,返回1查詢失敗 if (mysql_query(&mysql, query)){ // 執行指定為一個空結尾的字符串的SQL查詢。 printf("Query failed (%s)\n", mysql_error(&mysql)); return false; } else{ printf("query success\n"); } //獲取結果集 if (!(res = mysql_store_result(&mysql))) //獲得sql語句結束后返回的結果集 { printf("Couldn't get result from %s\n", mysql_error(&mysql)); return false; } //打印數據行數 printf("number of dataline returned: %d\n", mysql_affected_rows(&mysql)); //獲取字段的信息 char *str_field[32]; //定義一個字符串數組存儲字段信息 for (int i = 0; i < 4; i++) //在已知字段數量的情況下獲取字段名 { str_field[i] = mysql_fetch_field(res)->name; //返回一個所有字段結構的數組。 } for (int i = 0; i < 4; i++) //打印字段 printf("%10s\t", str_field[i]); printf("\n"); //打印獲取的數據 while (column = mysql_fetch_row(res)) //在已知字段數量情況下,獲取並打印下一行 { printf("%10s\t%10s\t%10s\t%10s\n", column[0], column[1], column[2], column[3]); //column是列數組 } return true; } bool QueryDatabase2() { mysql_query(&mysql, "set names gbk"); //返回0 查詢成功,返回1查詢失敗 if (mysql_query(&mysql, "select * from user")) //執行SQL語句 { printf("Query failed (%s)\n", mysql_error(&mysql)); return false; } else { printf("query success\n"); } res = mysql_store_result(&mysql); //打印數據行數 printf("number of dataline returned: %d\n", mysql_affected_rows(&mysql)); for (int i = 0; fd = mysql_fetch_field(res); i++) //獲取字段名 strcpy(field[i], fd->name); int j = mysql_num_fields(res); // 獲取列數 for (int i = 0; i<j; i++) //打印字段 printf("%10s\t", field[i]); printf("\n"); while (column = mysql_fetch_row(res)) { for (int i = 0; i<j; i++) printf("%10s\t", column[i]); printf("\n"); } return true; } //插入數據 bool InsertData() { //可以想辦法實現手動在控制台手動輸入指令 strcpy(query, "insert into user values (NULL, 'Lilei', 'wyt2588zs','lilei23@sina.cn');"); if (mysql_query(&mysql, query)) //執行SQL語句 { printf("Query failed (%s)\n", mysql_error(&mysql)); return false; } else { printf("Insert success\n"); return true; } } //修改數據 bool ModifyData() { strcpy(query, "update user set email='lilei325@163.com' where name='Lilei'"); if (mysql_query(&mysql, query)) //執行SQL語句 { printf("Query failed (%s)\n", mysql_error(&mysql)); return false; } else { printf("Insert success\n"); return true; } } //刪除數據 bool DeleteData() { /*sprintf(query, "delete from user where id=6");*/ char query[100]; printf("please input the sql:\n"); gets(query); //這里手動輸入sql語句 if (mysql_query(&mysql, query)) //執行SQL語句 { printf("Query failed (%s)\n", mysql_error(&mysql)); return false; } else { printf("Insert success\n"); return true; } }
關於里面很多函數可能看不懂。沒關系,下面都有(API接口匯總):
mysql_affected_rows() 返回被最新的UPDATE, DELETE或INSERT查詢影響的行數。
mysql_close() 關閉一個服務器連接。
mysql_connect() 連接一個MySQL服務器。該函數不推薦;使用mysql_real_connect()代替。
mysql_change_user() 改變在一個打開的連接上的用戶和數據庫。
mysql_create_db() 創建一個數據庫。該函數不推薦;而使用SQL命令CREATE DATABASE。
mysql_data_seek() 在一個查詢結果集合中搜尋一任意行。
mysql_debug() 用給定字符串做一個DBUG_PUSH。
mysql_drop_db() 拋棄一個數據庫。該函數不推薦;而使用SQL命令DROP DATABASE。
mysql_dump_debug_info() 讓服務器將調試信息寫入日志文件。
mysql_eof() 確定是否已經讀到一個結果集合的最后一行。這功能被反對; mysql_errno()或mysql_error()可以相反被使用。
mysql_errno() 返回最近被調用的MySQL函數的出錯編號。
mysql_error() 返回最近被調用的MySQL函數的出錯消息。
mysql_escape_string() 用在SQL語句中的字符串的轉義特殊字符。
mysql_fetch_field() 返回下一個表字段的類型。
mysql_fetch_field_direct () 返回一個表字段的類型,給出一個字段編號。
mysql_fetch_fields() 返回一個所有字段結構的數組。
mysql_fetch_lengths() 返回當前行中所有列的長度。
mysql_fetch_row() 從結果集合中取得下一行。
mysql_field_seek() 把列光標放在一個指定的列上。
mysql_field_count() 返回最近查詢的結果列的數量。
mysql_field_tell() 返回用於最后一個mysql_fetch_field()的字段光標的位置。
mysql_free_result() 釋放一個結果集合使用的內存。
mysql_get_client_info() 返回客戶版本信息。
mysql_get_host_info() 返回一個描述連接的字符串。
mysql_get_proto_info() 返回連接使用的協議版本。
mysql_get_server_info() 返回服務器版本號。
mysql_info() 返回關於最近執行得查詢的信息。
mysql_init() 獲得或初始化一個MYSQL結構。
mysql_insert_id() 返回有前一個查詢為一個AUTO_INCREMENT列生成的ID。
mysql_kill() 殺死一個給定的線程。
mysql_list_dbs() 返回匹配一個簡單的正則表達式的數據庫名。
mysql_list_fields() 返回匹配一個簡單的正則表達式的列名。
mysql_list_processes() 返回當前服務器線程的一張表。
mysql_list_tables() 返回匹配一個簡單的正則表達式的表名。
mysql_num_fields() 返回一個結果集合重的列的數量。
mysql_num_rows() 返回一個結果集合中的行的數量。
mysql_options() 設置對mysql_connect()的連接選項。
mysql_ping() 檢查對服務器的連接是否正在工作,必要時重新連接。
mysql_query() 執行指定為一個空結尾的字符串的SQL查詢。
mysql_real_connect() 連接一個MySQL服務器。
mysql_real_query() 執行指定為帶計數的字符串的SQL查詢。
mysql_reload() 告訴服務器重裝授權表。
mysql_row_seek() 搜索在結果集合中的行,使用從mysql_row_tell()返回的值。
mysql_row_tell() 返回行光標位置。
mysql_select_db() 連接一個數據庫。
mysql_shutdown() 關掉數據庫服務器。
mysql_stat() 返回作為字符串的服務器狀態。
mysql_store_result() 檢索一個完整的結果集合給客戶。
mysql_thread_id() 返回當前線程的ID。
mysql_use_result() 初始化一個一行一行地結果集合的檢索。
=============================================================================================================================================
第二種方式:通過MySQL的Connector C++
MySQL C++ Driver的實現基於JDBC規范
MySQL Connector/C++是由Sun Microsystems開發的MySQL連接器。它提供了基於OO的編程接口與數據庫驅動來操作MySQL服務器。
與許多其他現存的C++接口實現不同,Connector/C++遵循了JDBC規范。也就是說,Connector/C++ Driver的API主要是基於Java語言的JDBC接口。JDBC是java語言與各種數據庫連接的標准工業接口。
Connector/C++實現了大部分JDBC規范。如果C++程序的開發者很熟悉JDBC編程,將很快的入門。
MySQL Connector/C++需要安裝配置boost庫,boost庫安裝編譯在這里不進行闡述
1、新建一個空項目,
將F:\MySQL\Connector C++ 1.1.3\lib\opt添加到項目的庫目錄中(根據具體路徑而定)
將F:\MySQL\Connector C++ 1.1.3\include添加到VC++的包含目錄中(根據具體路徑而定),
將F:\boost\boost_1_55_0添加到VC++的包含目錄中(根據具體路徑而定)
添加mysqlcppconn.lib至鏈接器--->輸入--->附加依賴項中
同樣,如果使用的mysql是64位的,還需要將項目的解決方案平台由win32改成x64
將F:\MySQL\Connector C++ 1.1.3\lib\opt(根據具體路徑而定)下的mysqlcppconn.dll復制到項目中去,和.cpp,.h文件位於同一路徑下
將F:\MySQL\MySQL Server 5.6\lib(根據具體路徑而定)下的libmysql.dll復制到項目中去,和.cpp,.h文件位於同一路徑下(配置完成)
#include <iostream> #include <map> #include <string> #include <memory> #include "mysql_driver.h" #include "mysql_connection.h" #include "cppconn/driver.h" #include "cppconn/statement.h" #include "cppconn/prepared_statement.h" #include "cppconn/metadata.h" #include "cppconn/exception.h" using namespace std; using namespace sql; int main() { sql::mysql::MySQL_Driver *driver = 0; sql::Connection *conn = 0; try { driver = sql::mysql::get_mysql_driver_instance(); conn = driver->connect("tcp://localhost:3306/booktik", "root", "123456"); cout << "連接成功" << endl; } catch (...) { cout << "連接失敗" << endl; } sql::Statement* stat = conn->createStatement(); stat->execute("set names 'gbk'"); ResultSet *res; res = stat->executeQuery("SELECT * FROM BOOK"); while (res->next()) { cout << "BOOKNAME:" << res->getString("bookname") << endl; cout << " SIZE:" << res->getString("size") << endl; } if (conn != 0) { delete conn; } }
原文出處:超鏈接