1. 程式人生 > >13 MFC連線MySql資料庫

13 MFC連線MySql資料庫

  • 資料庫相關感念
    資料庫:是一個用來儲存各種資料的容器。
    資料庫管理系統:專門用於建立和管理資料庫的統一軟體,介於應用和作業系統之間,比如MySql Sql_Server Oracle等等;他們不僅有基礎的資料管理能力,還能保證資料的完整性、安全性和可靠性。
    資料庫應用程式:通過資料管理系統提供的介面,訪問和管理資料的應用程式。
    SQL語言:它是一種資料庫查詢語言和程式設計語言,主要用來管理資料庫中的資料,如儲存資料、查詢資料、更新資料和刪除資料等。
    本篇使用的資料庫為MySql,下載地址:
    https://downloads.mysql.com/archives/community/
  • 資料庫的安裝
    第一步:設定環境變數
    將你解壓後放置的檔案裡邊的bin目錄加入到path中。例如:D:\mysql-8.0.12-winx64\bin
    第二步:配置初始化my.ini
    在D:\mysql-8.0.12-winx64\中建立新增my.ini,內容如下(根據自己實際情況更改):
[mysqld]
# 設定3306埠
port=3306
# 設定mysql的安裝目錄
basedir=D:\\mysql-8.0.12-winx64  # 切記此處一定要用雙斜槓\\,單斜槓我這裡會出錯。
# 設定mysql資料庫的資料的存放目錄
datadir=D:\\mysql-8.0.12-winx64\\data   # 此處同上
# 允許最大連線數
max_connections=30
# 允許連線失敗的次數。這是為了防止有人從該主機試圖攻擊資料庫系統
max_connect_errors=10
# 服務端使用的字符集預設為UTF8
character-set-server=utf8
# 建立新表時將使用的預設儲存引擎
default-storage-engine=INNODB
# 預設使用“mysql_native_password”外掛認證
default_authentication_plugin=mysql_native_password
[mysql]
# 設定mysql客戶端預設字符集
default-character-set=utf8
[client]
# 設定mysql客戶端連線服務端時預設使用的埠
port=3306
default-character-set=utf8

第三步:初始化及安裝
1.以管理員(必須)身份執行cmd命令,並將路徑換到mysql的bin目錄下
   2. 初始化資料庫,執行命令:mysqld --initialize --console,這時會產生一個mysql的臨時密碼,我們要記下該密碼,儲存一下,登入和改密碼要用:
A temporary password is generated for [email protected]: tnylBrV34VR
  3 安裝服務,執行命令:mysqld --install [服務名] 其中服務名可以不寫,預設是mysql ,至此mysql就安裝完畢了
  4.接下來我們用剛才的臨時密碼將我們的root使用者密碼改成我們容易記且安全的!用命令: mysqladmin -uroot -ptn

ylBrV34VR password 123
安裝過程中可能出現的問題,有可能以前安裝過,或者初始化後我們換了目錄,這是mysql服務會啟動失敗,我們只需要將windows登錄檔中的如下項的路徑該成我們新路徑就可以了:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MySQL
在這裡插入圖片描述

  • 資料庫的基本操作
    在操作之前,我們先來看看什麼是資料庫,什麼是表,mysql實際是一個數據庫管理工具,我們先來看一下我們安裝的mysql下的data目錄,如下圖:
    在這裡插入圖片描述
    接下來開始操作資料庫:
    登入資料庫:輸入命令mysql -uroot -p後回車輸入密碼即可登入資料庫
    檢視資料庫:輸入show databases; 後回車可以檢視到有如下幾個資料庫
    在這裡插入圖片描述
    可以看到資料庫對應的是data目錄下的資料夾,接下來我們用use命令來選中mysql資料庫use mysql;
    查詢使用者資訊表:select * from user;可以看到一堆的使用者資訊,我們可以將表理解為資料夾下的檔案,它存放了我們的對應資訊;
    接下來我們使用 create database test;建立一個test資料庫,再用show databases;檢視資料庫如下:
    在這裡插入圖片描述
    我們再進入data目錄,可以看到在data目錄下建立了一個空資料夾:
    在這裡插入圖片描述
    檢視資料庫資訊: show create database test;
    在這裡插入圖片描述
    改變位元組集:alter database test default character set gbk collate gbk_bin;
    可以將gbk換成utf8就能改回來預設utf8字符集;
    刪除資料庫:drop database test;
    記下來我們先建立資料庫再建立一張userinfo 的表:
    create database test;
    use test;
    create table userinfo (id int, name varchar(80), age int);
    查看錶:show tables;
    看到我們建立的表如下:
    在這裡插入圖片描述
    切換到我們的data目錄下,開啟我們的資料庫資料夾test,看到裡面有一個userinfo.ibd檔案,我們可以用二進位制檢視軟體開啟,看一看裡面放的些什麼,可以看到除了一些位元組填值以外,其他位元組都是清零的。
    查看錶資訊:show create table userinfo;
    改表名: alter table userinfo rename user;
    查看錶結構:desc user;
    修改欄位:alter table user modify id int(6);
    修改欄位名:alter table user change id userid int(3);
    新增欄位:alter table user add new int(12);
    查看錶資料:
    select * from 表名;
    為表中所有欄位新增資料:
    insert into 表名(欄位1,欄位2,…) values(值1, 值2, …)
    更新欄位:
    update 表名 set 欄位=值 where 條件;
    刪除資料:
    delete from 表名 where 條件表示式
    下面我們建立一個基於對話方塊的MFC工程連線並操作資料庫,除錯時我們可以用show processlist;命令檢視連線狀況;由於64位問題太多,這裡我們將mysql的libmysql.lib和libmysql.dll換成32位的來用32位編譯,並且設定靜態庫和標頭檔案的路徑。我們程式效果如下,
    當點選按鈕能查出資料庫結果並彈出對話方塊顯示
    在這裡插入圖片描述
    我們在XXXXDlg.cpp檔案中新增標頭檔案及包含庫如下程式碼,XXXX為新建的工程名,對應自己的檔案;
#include "WinSock2.h"						//mysql用soket區連線資料庫,所以包含此標頭檔案
#include "mysql.h"							//包含mysql標頭檔案

#pragma comment (lib, "libmysql.lib")

在testButton的點選事件處理函式如下:

void CConnectMySqlDlg::OnBnClickedButton1()
{
	//定義MYSQL結構體指標,這裡我們可以F12跟進去看一下
	MYSQL *pMySql;
	MYSQL_RES *res;
	//初始化mysql,讓其給我們分配結構體空間
	pMySql = mysql_init(NULL);
	if (pMySql == NULL){
		AfxMessageBox(_T("mysql_init failed!"));
		return;
	}
	//與mysql資料庫進行連線
	if (!mysql_real_connect(pMySql, "127.0.0.1", "root", "123456", NULL, 3306, NULL, 0)){
		AfxMessageBox(_T("mysql_real_connect failed!"));
		return;
	}
	if (mysql_select_db(pMySql, "test") != 0){
		AfxMessageBox(_T("mysql_select_db failed!"));
		return;
	}
	if (mysql_query(pMySql, "select * from user;") != 0){
		AfxMessageBox(_T("mysql_query failed!"));
		return;
	}
	//儲存結果
	res = mysql_store_result(pMySql);
	if (res == NULL){
		AfxMessageBox(_T("res failed!"));
		return;
	}
	MYSQL_FIELD *field;
	//查詢欄位
	for (int i = 0; field = mysql_fetch_field(res); i++){
		AfxMessageBox(CString(field->name));
	}
	MYSQL_ROW row;
	CString str;
	//查詢內容
	mysql_set_character_set(pMySql, "utf16");
	while (row = mysql_fetch_row(res)){
		str.Format(_T("查詢結果:欄位1:%s, 欄位2:%s,欄位3:%s,欄位4:%s"), CString(row[0]), CString(row[1]), CString(row[2]), CString(row[3]));
		AfxMessageBox(CString(str));
	}

	//資源清理
	mysql_close(pMySql);
	mysql_free_result(res);
}