C++操作MySQL數據庫


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;
    }
}

 

 

原文出處:超鏈接


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM