13 MFC連線MySql資料庫
阿新 • • 發佈:2019-01-06
- 資料庫相關感念
資料庫:是一個用來儲存各種資料的容器。
資料庫管理系統:專門用於建立和管理資料庫的統一軟體,介於應用和作業系統之間,比如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
安裝過程中可能出現的問題,有可能以前安裝過,或者初始化後我們換了目錄,這是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);
}