最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++連接mysql數據庫(改進版)

 更新時間:2023年12月23日 11:46:56   作者:愛笑的蛐蛐  
C++是大家都非常熟悉的,也是大家平時辦公中經常會用到的,下面這篇文章主要給大家介紹了關于C++連接mysql數據庫的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下

使用vs2019對window11中的數據庫進行連接

1. 配置連接環(huán)境

首先需要把mysql中的頭文件和庫文件放入到c++項目工程中

1.打開安裝MySQL的目錄,在windows系統中如果是默認路徑,應該和我的是一樣的:C:\Program Files\MySQL\MySQL Server 8.0

2.找到include,和lib文件,include文件是包含的頭文件,lib文件是包含的庫文件

3.在創(chuàng)建的c++工程中加入include,lib文件路徑,按一下步驟

1.工程中的項目找到屬性

2.到 VC++ 目錄 中的包含目錄和庫目錄分別加入include文件和lib文件的路徑,

這是我的路徑:include文件路徑:C:\Program Files\MySQL\MySQL Server 8.0\include

lib文件路徑:C:\Program Files\MySQL\MySQL Server 8.0\lib

3. 到 鏈接器 中的 輸入 中的 附加依賴項中 加入 libmysql.lib 的依賴:

4.還需要把下圖中的 libmysql.dll 的文件復制到 C:\Windows\System32 目錄中

連接mysql可以參考 mysql參考手冊 進行查看

2.代碼實現連接

例子:

#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<mysql.h>#include<time.h>#include<stdlib.h>intmain(){
	int sr;
	srand((unsigned)time(NULL));
	sr = rand() % 50 + 1;
	//固定不變的
	MYSQL mysql;    //一個數據庫結構體  
	MYSQL_RES* res; //一個結果集結構體
	MYSQL_ROW row; //char** 二維數據,存放一條條記錄
	//初始化數據庫
	mysql_init(&mysql);
	//設置編碼方式
	mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, "gbk");
 
	//連接數據庫                    //ip地址	   //用戶名 //密碼       //數據庫名
	if (mysql_real_connect(&mysql, "localhost", "root", "Z20020803", "box_man", 3306, NULL, 0) == NULL)
	{
		printf("錯誤原因:%s\n", mysql_error(&mysql));
		printf("連接失敗\n");
		exit(-1);
	}
	//往數據庫中插入一個隨機數
	char* str1 = "insert into rand values(";
	char sql_insert[200];
	sprintf(sql_insert, "%s%d%s", str1, sr, ")");
	mysql_query(&mysql, sql_insert); //sql語句提交
	//查詢數據
	mysql_query(&mysql, "select * from rand");
	//獲取結果集
	res = mysql_store_result(&mysql);
	//給ROW賦值,判斷ROW是否為空,不為空就打印數據
	while (row = mysql_fetch_row(res))
	{
		printf("%s\n", row[0]);
	}
	//釋放結果集
	mysql_free_result(res);
	//關閉數據庫
	mysql_close(&mysql);
	//停留等待
	system("pause");
	return0;
 
}

使用c++語句對數據庫進行增刪改查,在使用c++中string類型時,需要把string類型轉換為c中的類型,使用mysql_query函數把sql語句提交,查詢成功返回0,結果會被保存到mysql對象中,查詢失敗會返回非0值:

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<mysql.h>
#include<string>
usingnamespace std;
 
intmain(){
	MYSQL mysql;
	MYSQL_RES* res;
	MYSQL_ROW row;
 
	mysql_init(&mysql);
 
	if (mysql_real_connect(&mysql, "localhost", "root", "Z20020803", "box_man", 3306, NULL, 0) == NULL)
	{
		printf("錯誤提示:%s\n", mysql_error(&mysql));
		printf("連接失敗\n");
	}
	//設置字符集
	mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, "gbk");
 
	string str1 = "alter table tb_77 modify sex varchar(20)";//修改表類型失敗
	mysql_query(&mysql, str1.c_str());
	string str = "insert into tb_77 values(5,'sdmqy','h')";//增加數據成功,不可以增加漢字
	mysql_query(&mysql, str.c_str());
	printf("%s", str.c_str());
	string str2 = "delete from tb_77 where sex = '女';";//刪除數據成功
	mysql_query(&mysql, str2.c_str());
	string str3 = "update tb_77 set name = 'ttb' where id = 2";//更改也行
	mysql_query(&mysql, str3.c_str());
 
	mysql_close(&mysql);
 
	return0;
}

3.各個類說明:

1. mysql句柄類(是一個結構體)

MYSQL mysql;

該類在c++中操作數據庫都要使用到

結構體原型:

typedef struct MYSQL {
  NET net;                     /* Communication parameters */
  unsigned char *connector_fd; /* ConnectorFd for SSL */
  char *host, *user, *passwd, *unix_socket, *server_version, *host_info;
  char *info, *db;
  struct CHARSET_INFO *charset;
  MYSQL_FIELD *fields;
  struct MEM_ROOT *field_alloc;
  uint64_t affected_rows;
  uint64_t insert_id;      /* id if insert on table with NEXTNR */
  uint64_t extra_info;     /* Not used */
  unsigned long thread_id; /* Id for connection in server */
  unsigned long packet_length;
  unsigned int port;
  unsigned long client_flag, server_capabilities;
  unsigned int protocol_version;
  unsigned int field_count;
  unsigned int server_status;
  unsigned int server_language;
  unsigned int warning_count;
  struct st_mysql_options options;
  enum mysql_status status;
  enum enum_resultset_metadata resultset_metadata;
  bool free_me;   /* If free in mysql_close */
  bool reconnect; /* set to 1 if automatic reconnect */
 
  /* session-wide random string */
  char scramble[SCRAMBLE_LENGTH + 1];
 
  LIST *stmts; /* list of all statements */
  const struct MYSQL_METHODS *methods;
  void *thd;
  /*
    Points to boolean flag in MYSQL_RES  or MYSQL_STMT. We set this flag
    from mysql_stmt_close if close had to cancel result set of this object.
  */
  bool *unbuffered_fetch_owner;
  void *extension;
} MYSQL;

2.MYSQL_RES查詢結果集(是一個結構體)

MYSQL_RES * res=nullptr;

用來保存查詢到的所有結果

結構體原型:

typedef struct MYSQL_RES {
  uint64_t row_count;
  MYSQL_FIELD *fields;
  struct MYSQL_DATA *data;
  MYSQL_ROWS *data_cursor;
  unsigned long *lengths; /* column lengths of current row */
  MYSQL *handle;          /* for unbuffered reads */
  const struct MYSQL_METHODS *methods;
  MYSQL_ROW row;         /* If unbuffered read */
  MYSQL_ROW current_row; /* buffer to current row */
  struct MEM_ROOT *field_alloc;
  unsigned int field_count, current_field;
  bool eof; /* Used by mysql_fetch_row */
  /* mysql_stmt_close() had to cancel this result */
  bool unbuffered_fetch_cancelled;
  enum enum_resultset_metadata metadata;
  void *extension;
} MYSQL_RES;

3.MYSQL_ROW獲取結果集中的內容:本質上是一個char類型的二級指針

MYSQL_ROW row

該變量可以獲取到結果集中的數據

4.MYSQL_FIELD獲取結果集中表的所有內容(是一個結構體)

結構體原型:

typedef struct MYSQL_FIELD {
  char *name;               /* Name of column */
  char *org_name;           /* Original column name, if an alias */
  char *table;              /* Table of column if column was a field */
  char *org_table;          /* Org table name, if table was an alias */
  char *db;                 /* Database for table */
  char *catalog;            /* Catalog for table */
  char *def;                /* Default value (set by mysql_list_fields) */
  unsigned long length;     /* Width of column (create length) */
  unsigned long max_length; /* Max width for selected set */
  unsigned int name_length;
  unsigned int org_name_length;
  unsigned int table_length;
  unsigned int org_table_length;
  unsigned int db_length;
  unsigned int catalog_length;
  unsigned int def_length;
  unsigned int flags;         /* Div flags */
  unsigned int decimals;      /* Number of decimals in field */
  unsigned int charsetnr;     /* Character set */
  enum enum_field_types type; /* Type of field. See mysql_com.h for types */
  void *extension;
} MYSQL_FIELD;

4.一些函數說明

mysql的使用手冊網址:MySQL :: MySQL 8.0 C API 開發(fā)人員指南 :: 5.4.23 mysql_field_count()

部分API函數

函數

作用

mysql_init()

獲取或初始化MYSQL結構。

mysql_real_connect()

連接到MySQL服務器。

mysql_query()

執(zhí)行指定為“以Null終結的字符串”的SQL查詢。

mysql_store_result()

檢索完整的結果集至客戶端。

mysql_use_result()

初始化逐行的結果集檢索

mysql_fetch_field()

返回下一個表字段的類型。

mysql_fetch_fields()

返回所有字段結構的數組。

mysql_fetch_lengths()

返回當前行中所有列的長度。

mysql_fetch_row()

從結果集中獲取下一行

mysql_field_count()

返回上次執(zhí)行語句的結果列的數目。

mysql_free_result()

釋放結果集使用的內存。

mysql_close()

關閉服務器連接。

mysql_autocommit()

切換 autocommit模式,ON/OFF

mysql_commit()

提交事務。

mysql_errno()

返回上次調用的MySQL函數的錯誤編號

mysql_options()

為mysql_connect()設置連接選項

mysql_ping()

檢查與服務器的連接是否工作,如有必要重新連接。

在下列函數中,從連接數據庫到獲取數據庫中的數據主要使用到1-7的函數。

1.mysql_init函數:初始化MYSQL變量

函數原型:

MYSQL *mysql_init(MYSQL *mysql) 
    說明:
        1.如果mysql是NULL指針,該函數將分配、初始化、并返回新對象。
        2.否則,將初始化對象,并返回對象的地址。
        3.如果mysql_init()分配了新的對象,應當在程序中調用mysql_close() 來關閉連接,以釋放對象
    參數解釋:
    返回值:初始化的MYSQL*句柄。如果無足夠內存以分配新的對象,返回NULL。 
錯誤,在內存不足的情況下,返回NULL    

2.mysql_read_connect函數:使用該函數連接mysql數據庫

函數原型:

mysql_real_connect(
    MYSQL *mysql,   ///< 數據庫句柄
    constchar *host, ///< 主機名
    constchar *user, ///< 用戶名
    constchar *passwd,///< 密碼
    constchar *db, ///< 數據庫名
    unsignedint port, ///< 端口號(MySQL為3306)
    constchar *unix_socket,///< unix_socket–unix連接方式,為NULL時表示不使用socket或管道機制
    unsignedlong clientflag ///< clientflag–Mysql運行為ODBC數據庫的標記,一般取0,該參數可以設置提交的sql語句為多條語句
    );
 
    作用:連接數據庫引擎,通過函數mysql_real_connect()嘗試與運行在主機上的MySQL數據庫引擎建立連接。
    返回值:如果連接成功,返回MYSQL*連接句柄。如果連接失敗,返回NULL。對于成功的連接,返回值與第1個參數的值相同。

3.mysql_real_query和mysql_query函數:進行數據庫查詢(也就是遞交sql語句)

函數原型:

int STDCALL mysql_real_query(MYSQL *mysql, const char *query, unsigned long length);
    說明:執(zhí)行由“Null終結的字符串”查詢指向的SQL查詢。
正常情況下,字符串必須包含1條SQL語句,而且不應為語句添加終結分號(‘;')或“\g”。
如果允許多語句執(zhí)行,字符串可包含多條由分號隔開的語句。(“多查詢執(zhí)行的C API處理”)mysql_query()
不能用于包含二進制數據的查詢,應使用mysql_real_query()取而代之(二進制數據可能包含字符‘\0',
mysql_query()會將該字符解釋為查詢字符串結束)。如果希望了解查詢是否應返回結果集,
可使用mysql_field_count()進行檢查。
    返回值:如果查詢成功,返回0。如果出現錯誤,返回非0值。
 
 
int mysql_query(MYSQL *mysql, const char *query) 
    返回值:如果查詢成功,返回0。如果出現錯誤,返回非0值。
    參數解釋:
        參數mysql:前面使用MYSQL結構體定義的變量;
        參數query:sql語句
        參數length:sql語句的長度

4.mysql_store_result和mysql_use_result函數:獲取查詢結果數據

函數原型:

MYSQL_RES *mysql_store_result(MYSQL *mysql) 
    說明:
        1.對于成功檢索了數據的每個查詢(SELECT、SHOW、DESCRIBE、EXPLAIN、CHECK TABLE等)
    ,必須調用mysql_store_result()或mysql_use_result() 。
        2.如果希望了解查詢是否應返回結果集,可使用mysql_field_count()進行檢查。
        3.如果查詢未返回結果集,mysql_store_result()將返回Null指針(例如,
    如果查詢是INSERT語句)。
        4.如果讀取結果集失敗,mysql_store_result()還會返回Null指針。通過檢查mysql_error()
    是否返回非空字符串,mysql_errno()是否返回非0值,或mysql_field_count()是否返回0,
    可以檢查是否出現了錯誤。
        5.如果未返回行,將返回空的結果集。(空結果集設置不同于作為返回值的空指針)。
        6.一旦調用了mysql_store_result()并獲得了不是Null指針的結果,可調用
    mysql_num_rows()來找出結果集中的行數。
        7.可以調用mysql_fetch_row()來獲取結果集中的行,或調用mysql_row_seek()和
    mysql_row_tell()來獲取或設置結果集中的當前行位置。
        8.一旦完成了對結果集的操作,必須調用mysql_free_result()。
    返回值:具有多個結果的MYSQL_RES結果集合。如果出現錯誤,返回NULL。
MYSQL_RES *  mysql_use_result(MYSQL *mysql);
    
    說明:調用mysql_use_result初始化檢索,以便于后面一行一行的讀取結果集,而它本身并沒有從
服務器讀取任何數據,這種方式較之第一種速度更快且所需內存更少,但它會綁定服務器,阻止其他線程
更新任何表,而且必須重復執(zhí)行mysql_fetch_row讀取數據,直至返回NULL,否則未讀取的行會在下一
次查詢時作為結果的一部分返回,故經常我們使用mysql_store_result。

5.mysql_fetch_row函數:讀取結果集數據

函數原型:

MYSQL_ROW mysql_fetch_row(MYSQL_RES* result)
    說明:
        1.在mysql_store_result()之后使用時,如果沒有要檢索的行,mysql_fetch_row()返回NULL。
        2.在mysql_use_result()之后使用時,如果沒有要檢索的行或出現了錯誤,
    mysql_fetch_row()返回NULL。
        3.行內值的數目由mysql_num_fields(result)給出。如果行中保存了調用
    mysql_fetch_row()返回的值,將按照row[0]到row[mysql_num_fields(result)-1],
    訪問這些值的指針。
        4.可以通過調用mysql_fetch_lengths()來獲得行中字段值的長度。對于空字段以及
    包含NULL的字段,長度為0。通過檢查字段值的指針,能夠區(qū)分它們。如果指針為NULL,
    字段為NULL,否則字段為空。
    參數:是函數mysql_store_result或mysql_use_result的返回值
    返回值:下一行的MYSQL_ROW結構。如果沒有更多要檢索的行或出現了錯誤,返回NULL。

6.mysql_free_result函數:釋放結果集

函數原型:

void mysql_free_result(MYSQL_RES *result) 
    說明:釋放由mysql_store_result()、mysql_use_result()、mysql_list_dbs()等為結果
集分配的內存。完成對結果集的操作后,必須調用mysql_free_result()釋放結果集使用的內存。

7.mysql_close函數:關閉數據庫連接

函數原型:

void mysql_close(MYSQL *mysql) 
    說明:關閉前面打開的連接。如果句柄是由mysql_init()或mysql_connect()自動分配的,
mysql_close()還將解除分配由mysql指向的連接句柄。

8.mysql_num_fields(MYSQL_RES*):該函數可以拿表中的列數,返回值是一個unsigned類型

函數原型:

unsigned int STDCALL mysql_num_fields(MYSQL_RES *res);

9.mysql_fetch_fields(MYSQL_RES*): 該函數可以拿到表中每一列的字段名,返回的是一個結構體數組

函數原型:

MYSQL_FIELD *STDCALL mysql_fetch_fields(MYSQL_RES *res);

10.mysql_fetch_lengths(MYSQL_RES*):該函數拿到行中每一列的字段長度,返回結果是一個unsigned類型

函數原型:

unsigned long *STDCALL mysql_fetch_lengths(MYSQL_RES *result);

11.mysql_field_count函數:返回最近查詢的列數 。

函數原型:

unsigned int mysql_field_count(MYSQL *mysql) 
    說明:此函數的正常用法是當返回 mysql_store_result() 時(因此您沒有結果集) 指針)。
在這種情況下,您可以調用 mysql_field_count() 來 確定 mysql_store_result() 
是否應 產生了非空的結果

5.事務設置:

在mysql中事務是默認自動提交的,如果需要提交的事務多,對我們的操作會有影響,所以需要設置事務為手動提交

  • mysql_autocommit(MYSQL* , mode) 設置事務是否自動提交函數

參數:mode如果為“1”,自動提交,為“0”為手動提交 返回值:提交成功返回0,否則返回非0

  • mysql_commit(MYSQL* mysql) 事務提交函數

返回值:成功返回0,否則返回非0

  • mysql_rollback(MYSQL* mysql) 事務回滾函數

返回值:成功返回0,否則返回非0

6.打印錯誤信息:

  • const char* mysql_error(MYSQL* mysql):返回錯誤信息的描述
  • const char* mysql_errno(MYSQL* mysql):返回錯誤的編號

代碼使用的例子

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<mysql.h>
usingnamespace std;
 
intmain(){
	//創(chuàng)建句柄
	MYSQL mysql;
	//創(chuàng)建數據集變量
	MYSQL_RES* res = nullptr;
	//創(chuàng)建結果集變量
	MYSQL_ROW row;
	//創(chuàng)建一個結構體
	MYSQL_FIELD* field;
 
	//初始化數據庫句柄
	mysql_init(&mysql);
	//設置字符集
	//mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, "gbk");
	mysql_set_character_set(&mysql, "gbk");
	//開始連接數據庫
	if (mysql_real_connect(&mysql, "localhost", "root", "Z20020803", "box_man", 3306, NULL, 0))
	{
		cout << "連接成功" << endl;
	}
	else
	{
		cout << "連接失敗" << endl;
		return0;
	}
	//設置事務
	mysql_autocommit(&mysql, "1");
	//增加數據
	string str1 = "insert into tb_912 values(2, 'xiaoming', '李四');";
	char ssql[1024];
	//使用sprintf拼出來的語句是一個標準的c語言字符串,可以使用該函數插入變量值
	sprintf(ssql, "insert into tb_912 values(%d, '%s', '%s');", 3, "daming", "17777777772");
	if (mysql_query(&mysql, ssql))//該語句提交成功返回0,失敗返回1
	{
		cout << "提交失敗" << endl;
	}
	else
	{
		cout << "提交成功" << endl;
	}
	//提交語句
	mysql_query(&mysql, str1.c_str());
	//刪除數據
	string str3 = "delete from tb_912 where id = 2";
	mysql_query(&mysql, str3.c_str());
	//修改數據
	string str4 = "update tb_912 set name = '張三' where id = 1";
	mysql_query(&mysql, str4.c_str());
	//查詢數據
	string str2 = "select * from tb_912";
	mysql_query(&mysql, str2.c_str());
	//事務提交
	mysql_commit(&mysql);
	//獲取里面的結果集
	res = mysql_store_result(&mysql);
	//拿到結果集得列數,調用的是 mysql_store_result() 的返回值,
	unsignedint a = mysql_num_fields(res);
	cout <<"表得列數:"<< a << endl;
	//使用 mysql_fetch_fields() 函數獲取列的名字,返回的是一個結構體數組
	field = mysql_fetch_fields(res);
	for (unsigned i = 0; i < a; i++)
	{
		cout << "當前列的名字:" << field[i].name << endl;//取出名字
	}
	unsignedlong* lengths;
 
	//從結果集中獲取到數據 mysql_fetch_row() 獲取結果集中的一行數據,
	//成功:返回記錄當前行中每個字段的值,失?。悍祷匾粋€null
	while (row = mysql_fetch_row(res))
	{
		printf("%s %s %s \n", row[0], row[1], row[2]);
		//獲取列中字段的長度
		lengths = mysql_fetch_lengths(res);//返回的是一個數組地址
		
		for (unsignedint i = 0; i < a; i++)
		{
			cout << "當前列的長度:" << lengths[i] << endl;//列數會構成一個數組
		}
	}
	//釋放結果集
	mysql_free_result(res);
	//關閉mysql實例
	mysql_close(&mysql);
	return0;
}

多條語句提交的代碼實現

#include<iostream>
#include<mysql.h>
#include<thread>
#include<sstream>
#include<map>
 
using namespace std;
 
int main()
{
    //1.創(chuàng)建句柄
    MYSQL mysql;
    //2.初始化mysql
    mysql_init(&mysql);
    const char* host = "127.0.0.1";
    const char* user = "root";
    const char* pwd = "Z20020803";
    const char* db = "database1";
 
    //設定字符集
    mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, "gbk");
    //3.連接數據庫
    //一次性執(zhí)行多條語句,mysql_real_connect 函數的最后一個參數設置
    if (!mysql_real_connect(&mysql, host, user, pwd, db, 3306, 0, CLIENT_MULTI_STATEMENTS))//阻塞函數
    {
        cout << "connect fail, " << mysql_error(&mysql) << endl;
    }
    else
    {
        cout << "mysql connect " << host << "success" << endl;
    }
    //1.創(chuàng)建表
    string sql = "CREATE TABLE IF NOT EXISTS t_image (\
        id int AUTO_INCREMENT,\
        name varchar(1024),\
        path varchar(1024),\
        size int,\
        PRIMARY KEY(id)\
        );";
    //2.刪除數據
    sql += "truncate t_image;";
    //3.插入數據
    for (int i = 0; i < 1000; i++)
    {
        //sql = "insert t_image (name, path, size) values ('test.jpg', 'd:/img/test.jpg', 1024)";
        stringstream ss;//用于拼接字符串
        ss << "insert t_image (name, path, size) values ('image";
        ss << i << ".jpg', 'd:/image/',1024);";
        sql += ss.str();
    }
    //4.修改數據
    sql += "update t_image set name = 'test3.png', size = 100 where id = 3;";
    //5.刪除數據
    sql += "delete from t_image where id = 1;";
    //6.查詢數據
    sql += "select * form t_image;";
 
    //執(zhí)行sql語句會立刻返回,但在數據庫中是沒有執(zhí)行好的,需要獲取結果
    int re = mysql_query(&mysql, sql.c_str());//只提交一次
    if (re == 0)
    {
        int count = mysql_affected_rows(&mysql);
        cout << "mysql_affected_rows " << count << "id = " << mysql_insert_id(&mysql) << endl;
    }
    else
    {
        cout << "mysql_query failed " << mysql_error(&mysql) << endl;
    }
 
    //多個返回結果
    do {
        MYSQL_RES* result = mysql_store_result(&mysql);
        if (result)
        {
            cout << "有select數據,行數:" << mysql_num_rows(result) << endl;
            mysql_free_result(result);//釋放結果集
        }
        else//INSERT UPDATE DELETE CREATE DROP truncate
        {
            if (mysql_field_count(&mysql) > 0)//select 是否為空
            {
                cout << "Not retrieve result!" << mysql_error(&mysql) << endl;
            }
            else//INSERT UPDATE DELETE CREATE DROP truncate
            {
                //等待執(zhí)行結果集
                cout << mysql_affected_rows(&mysql) << " rows affectd" << endl;
            }
        }
    } while (mysql_next_result(&mysql) == 0);//表示還有下一條結果
    mysql_close(&mysql);
    mysql_library_end();
 
    getchar();
 
    return 0;
}
 

圖片的插入及獲取

#include<iostream>
#include<mysql.h>
#include<thread>
#include<sstream>
#include<map>
#include<chrono>
#include<fstream>
 
using namespace std;
using namespace chrono;
 
 
int main()
{
    //1.創(chuàng)建句柄
    MYSQL mysql;
    //2.初始化mysql
    mysql_init(&mysql);
    const char* host = "127.0.0.1";
    const char* user = "root";
    const char* pwd = "Z20020803";
    const char* db = "database1";
 
    //設定字符集
    mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, "gbk");
    //3.連接數據庫
    if (!mysql_real_connect(&mysql, host, user, pwd, db, 3306, 0, CLIENT_MULTI_STATEMENTS))//阻塞函數
    {
        cout << "connect fail, " << mysql_error(&mysql) << endl;
    }
    else
    {
        cout << "mysql connect " << host << "success" << endl;
    }
    //1.創(chuàng)建表  使用了二進制的blob類型
    string sql = "CREATE TABLE IF NOT EXISTS t_data (\
        id int AUTO_INCREMENT,\
        name varchar(1024),\
        data blob,\
        size int,\
        PRIMARY KEY(id)\
        )ENGINE=InnoDB;";
 
    int re = mysql_query(&mysql, sql.c_str());
    if (re != 0)
    {
        cout << mysql_error(&mysql) << endl;
    }
 
    //2.清空表
    sql = "truncate t_data";
    re = mysql_query(&mysql, sql.c_str());
    if (re != 0)
    {
        cout << mysql_error(&mysql) << endl;
    }
    
    //3..創(chuàng)建stmt對象
    MYSQL_STMT* stmt = mysql_stmt_init(&mysql);
    if (!stmt)
    {
        cout << "mysql_stmt_init " << mysql_error(&mysql) << endl;
    }
 
 
    //4.預處理sql語句
    sql = "INSERT INTO t_data (name, data, size) VALUES(?,?,?)";
    if (mysql_stmt_prepare(stmt, sql.c_str(), sql.size()))
    {
        cerr << "mysql_stmt_prepare failed" << mysql_stmt_error(stmt) << endl;
    }
 
    //使用c++方式打開文件,也可以使用c語言的方式打開文件
    //5.打開文件
    string filename = "1.jpg";
    //文件大小和文件二進制地址
    int filesize = 0;
    //讀取二進制
    fstream in(filename, ios::in | ios::binary);
    if (!in.is_open())
    {
        cerr << "file " << filename << " open failed!" << endl;
    }
    //文件指針移動到結尾處
    in.seekg(0, ios::end);
    //文件大小和文件二進制地址
    filesize = in.tellg();
    //文件指針回到開頭
    in.seekg(0, ios::beg);
 
    //讀取數據
    char* data = new char[filesize];
    int readed = 0;//已經讀了多少
    while (!in.eof())
    {
        in.read(data + readed, filesize - readed);
        //讀取了多少字節(jié)
        if (in.gcount() <= 0)
        {
            break;
        }
        readed += in.gcount();
    }
    in.close();
 
 
    //6.綁定字段
    MYSQL_BIND bind[3] = { 0 };
    bind[0].buffer_type = MYSQL_TYPE_STRING; //name 文件名
    bind[0].buffer = (char*)filename.c_str();
    bind[0].buffer_length = filename.size();
 
    bind[1].buffer_type = MYSQL_TYPE_BLOB;
    bind[1].buffer = data;
    bind[1].buffer_length = filesize;
 
    //文件大小
    bind[2].buffer_type = MYSQL_TYPE_LONG;
    bind[2].buffer = &filesize;
 
    //綁定stmt對象
    if (mysql_stmt_bind_param(stmt, bind) != 0)
    {
        cerr << "mysql_stmt_bind_param failed" << mysql_stmt_error(stmt) << endl;
    }
 
    //7.執(zhí)行stmt sql
    if (mysql_stmt_execute(stmt) != 0)
    {
        cerr << "mysql_stmt_execute failed" << mysql_stmt_error(stmt) << endl;
    }
 
    delete data;
    mysql_stmt_close(stmt);
 
    //獲取數據
    sql = "select * from t_data";
    re = mysql_query(&mysql, sql.c_str());
    if (re != 0)
    {
        cout << "mysql_store_result failed" << mysql_error(&mysql) << endl;
    }
    //獲取結果集
    MYSQL_RES* res = mysql_store_result(&mysql);
    if (res == NULL)
    {
        cerr << "mysql_store_result failed" << mysql_error(&mysql) << endl;
    }
    //取一行數據
    MYSQL_ROW row = mysql_fetch_row(res);
    if (!row)
    {
        cerr << "mysql_fetch_row failed" << mysql_error(&mysql) << endl;
    }
    cout << row[0] << " " << row[1] << " " << row[2] << endl;
    //獲取每一列字段的長度
    unsigned long* lens = mysql_fetch_lengths(res);
    int fnum = mysql_num_fields(res);//獲取每一列的字段長度
 
    filename = "out_";
    filename += row[1];
    fstream out(filename, ios::out | ios::binary);
    if (!out.is_open())
    {
        cout << "open file " << filename << " failed" << endl;
    }
    out.write(row[2], lens[2]);
    out.close();
 
 
    mysql_close(&mysql);
    mysql_library_end();
 
    getchar();
 
    return 0;
}
 

存儲過程的創(chuàng)建和使用

#include<iostream>
#include<mysql.h>
#include<thread>
#include<sstream>
#include<map>
 
using namespace std;
 
int main()
{
    //1.創(chuàng)建句柄
    MYSQL mysql;
    //2.初始化mysql
    mysql_init(&mysql);
    const char* host = "127.0.0.1";
    const char* user = "root";
    const char* pwd = "Z20020803";
    const char* db = "database1";
 
    //設定字符集
    mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, "gbk");
    //3.連接數據庫
    //一次性執(zhí)行多條語句,mysql_real_connect 函數的最后一個參數設置
    if (!mysql_real_connect(&mysql, host, user, pwd, db, 3306, 0, CLIENT_MULTI_STATEMENTS))//阻塞函數
    {
        cout << "connect fail, " << mysql_error(&mysql) << endl;
    }
    else
    {
        cout << "mysql connect " << host << "success" << endl;
    }
    string sql = "";
 
    //1.創(chuàng)建存儲過程
    sql = "CREATE PROCEDURE p_test(IN p_in INT, OUT p_out INT, INOUT p_inout INT)\
        BEGIN\
        select p_in, p_out, p_inout;\
        set p_in = 100, p_out = 200, p_inout = 300;\
        select p_in, p_out, p_inout;\
        END";
    int re = mysql_query(&mysql, sql.c_str());
    if (re != 0)
    {
        cout << mysql_error(&mysql) << endl;
    }
    //2.定義數據庫的變量,并且賦值
    cout << "A = 1, B = 2, C = 3" << endl;
    sql = "SET @A=1;SET @B=2;SET @C=3;";
    re = mysql_query(&mysql, sql.c_str());
    if (re != 0)
    {
        cout << mysql_error(&mysql) << endl;
    }
    //需要獲取結果集并且釋放
    do
    {
        cout << "set affected " << mysql_affected_rows(&mysql) << endl;
    } while (mysql_next_result(&mysql) == 0);// 等于0表示還有結果,等于-1表示沒有結果了,大于0表示出錯
 
    //3.調用存儲過程
    sql = "call p_test(@A,@B,@C)";
    re = mysql_query(&mysql, sql.c_str());
    if (re != 0)
    {
        cout << "select " << mysql_error(&mysql) << endl;
    }
    cout << "in proce:";
    do
    {
        MYSQL_RES* res = mysql_store_result(&mysql);
        if (!res)
        {
            continue;
        }
        //字段數量
        int fcount = mysql_num_fields(res);
        //打印結果集
        for (;;)
        {
            MYSQL_ROW row = mysql_fetch_row(res);
            if (!row)
            {
                break;
            }
            for (int i = 0; i < fcount; i++)
            {
                if (row[i])
                {
                    cout << row[i] << " ";
                }
                else
                {
                    cout << "NULL ";
                }
            }
            cout << endl;
        }
        mysql_free_result(res);
    } while (mysql_next_result(&mysql) == 0);
 
    //獲取存儲過程
    sql = "select @A,@B,@C";
    re = mysql_query(&mysql, sql.c_str());
    if (re != 0)
    {
        cout << mysql_error(&mysql) << endl;
    }
    MYSQL_RES* res1 = mysql_store_result(&mysql);
    MYSQL_ROW row = mysql_fetch_row(res1);
    int num = mysql_num_fields(res1);
    for (int i = 0; i < num; i++)
    {
        cout << row[i] << " ";
    }
    mysql_free_result(res1);
    
    
    mysql_close(&mysql);
    mysql_library_end();
 
    getchar();
 
    return 0;
}

總結

到此這篇關于C++連接mysql數據庫的文章就介紹到這了,更多相關C++連接mysql內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • c++如何讀取文件中的內容和往文件中寫入數據

    c++如何讀取文件中的內容和往文件中寫入數據

    C++文件流是用于進行文件讀寫操作的工具,它提供了一種能夠簡單、高效地與外部文件進行交互的方式,這篇文章主要介紹了c++如何讀取文件中的內容和往文件中寫入數據,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-09-09
  • c++ qsort 與sort 對結構體排序實例代碼

    c++ qsort 與sort 對結構體排序實例代碼

    這篇文章主要介紹了c++ qsort 與sort 對結構體排序實例代碼,幫助大家更好的理解和學習c++,感興趣的朋友可以了解下
    2020-11-11
  • C語言動態(tài)內存管理的實現

    C語言動態(tài)內存管理的實現

    本文主要介紹了C語言動態(tài)內存管理的實現,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Visual Studio安裝的圖文教程

    Visual Studio安裝的圖文教程

    這篇文章主要介紹了Visual Studio安裝的圖文教程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • C++動態(tài)加載so/dll庫的實現

    C++動態(tài)加載so/dll庫的實現

    本文主要介紹了C++動態(tài)加載so/dll庫的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-07-07
  • 一篇文章徹底弄懂C++虛函數的實現機制

    一篇文章徹底弄懂C++虛函數的實現機制

    C++中的虛函數的作用主要是實現了多態(tài)的機制,基類定義虛函數,子類可以重寫該函數,在派生類中對基類定義的虛函數進行重寫時,需要在派生類中聲明該方法為虛方法,這篇文章主要給大家介紹了關于如何通過一篇文章徹底弄懂C++虛函數的實現機制,需要的朋友可以參考下
    2021-06-06
  • Matlab實現繪制立體玫瑰花的示例代碼

    Matlab實現繪制立體玫瑰花的示例代碼

    這篇文章主要介紹了如何利用Matlab實現繪制更立體的玫瑰花,文中的示例代碼講解詳細,對我們學習Matlab有一定的幫助,需要的可以參考一下
    2023-02-02
  • C++求所有頂點之間的最短路徑(用Floyd算法)

    C++求所有頂點之間的最短路徑(用Floyd算法)

    這篇文章主要為大家詳細介紹了C++求所有頂點之間的最短路徑,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • C++中std::tuple和std::pair的實現

    C++中std::tuple和std::pair的實現

    std::tuple和std::pair是兩種極具實用性的數據結構,本文主要介紹了C++中std::tuple和std::pair的實現,具有一定的參考價值,感興趣的可以了解一下
    2025-02-02
  • windows下如何安裝OpenCL

    windows下如何安裝OpenCL

    這篇文章主要介紹了windows下如何安裝OpenCL,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-05-05

最新評論

平定县| 乌兰察布市| 古田县| 桐梓县| 乐山市| 盘锦市| 吉安市| 宕昌县| 澜沧| 朝阳市| 平果县| 双城市| 南丰县| 阳信县| 神木县| 开远市| 桃园县| 清丰县| 扶余县| 定安县| 依安县| 合阳县| 红桥区| 东平县| 兴城市| 甘南县| 建水县| 兰州市| 汤原县| 蓬安县| 溧水县| 周口市| 措勤县| 青龙| 平阳县| 海淀区| 泰安市| 泽州县| 阳泉市| 陵水| 松溪县|