c++操作mysql
先定義一個數據庫管理的cpp文件和頭文件。
MySQLManager.h 文件:
#pragma once
// 網絡通信頭文件
#include <WinSock.h>
// 引入mysql頭文件(比較好的做法是把文件夾拷到工程目錄,也可以在vc目錄裏面設置)
#include "include/mysql.h"
#include <Windows.h>
// 包含附加依賴項,也可以在工程--屬性裏面設置
#pragma comment(lib, "wsock32.lib")
#pragma comment(lib, "libmysql.lib")
// 連接數據庫的一些必要信息
struct ConnectionInfo
{
const char* host; // 主機地址
const char* user; // 用戶名
const char* password; // 密碼
const char* database; // 數據庫名
unsigned int port; // 端口號
const char* unix_socket; // unix連接標識
unsigned long clientflag; // 客戶端連接標誌
// 構造函數,設置一些默認值
ConnectionInfo() :
host("127.0.0.1"),
port(3306),
unix_socket(NULL),
clientflag(0)
{
}
};
class MySQLManager
{
public:
// 連接數據庫
bool Init(ConnectionInfo& info);
// 釋放連接
bool FreeConnect();
// 增加數據
// bool InsertData(const char* sql);
// 刪除數據
// bool DeleteData(const char* sql);
// 更新數據
// bool UpdateData(const char* sql);
// 執行sql語句, 包括增加、刪除、更新數據
bool ExecuteSql(const char* sql);
// 查詢數據
MYSQL_RES* QueryData(const char* sql);
// 打印結果集
void PrintQueryRes();
private:
MYSQL m_mysql; // mysql連接
MYSQL_RES* m_res; // 查詢結果集
};
MySQLManager.cpp 文件:
#include <iostream>
#include <stdio.h>
using namespace std;
// 連接數據庫
bool MySQLManager::Init(ConnectionInfo& info)
{
// 初始化mysql,連接mysql,數據庫
mysql_init(&m_mysql);
// 連接失敗
if (!(mysql_real_connect(&m_mysql, info.host, info.user, info.password, info.database, info.port, info.unix_socket, info.clientflag)))
{
return false;
}
return true;
}
// 釋放連接
bool MySQLManager::FreeConnect()
{
//釋放資源
mysql_free_result(m_res);
mysql_close(&m_mysql);
return false;
}
// 執行sql語句, 包括增加、刪除、更新數據
bool MySQLManager::ExecuteSql(const char * sql)
{
if (mysql_query(&m_mysql, sql))
{
// 打錯誤log,這裏直接顯示到控制檯
cerr << "執行sql語句失敗,錯誤信息爲: " << mysql_error(&m_mysql) << endl;
return false;
}
else
{
cout << "執行sql語句成功!" << endl;
}
return true;
}
// 查詢數據
MYSQL_RES* MySQLManager::QueryData(const char* sql)
{
if (mysql_query(&m_mysql, sql))
{
// 打錯誤log,這裏直接顯示到控制檯
cerr << "查詢語句執行失敗,錯誤信息爲: " << mysql_error(&m_mysql) << endl;
return nullptr;
}
else
{
cout << "查詢語句執行成功!" << endl;
}
// 存儲查詢結果
m_res = mysql_store_result(&m_mysql);
return m_res;
}
// 遍歷結果集
void MySQLManager::PrintQueryRes()
{
if (nullptr == m_res || NULL == m_res)
{
return;
}
// 獲取行數
// unsigned int rows = mysql_affected_rows(m_mysql);
// 字段列數組
MYSQL_FIELD* field = nullptr;
//存字段名二維數組
char fieldName[64][32];
// 獲取字段名
for (int i = 0; field = mysql_fetch_field(m_res); ++i)
{
strcpy_s(fieldName[i], field->name);
}
// 獲取列數
int columns = mysql_num_fields(m_res);
for (int i = 0; i < columns; ++i)
{
// 使用C語言的printf格式化更方便一點
printf("%10s\t", fieldName[i]);
}
cout << endl;
MYSQL_ROW row;
while (row = mysql_fetch_row(m_res))
{
for (int i = 0; i < columns; ++i)
{
printf("%10s\t", row[i]);
}
cout << endl;
}
}
main函數:
#include <iostream>
#include "MySQLManager.h"
using namespace std;
int main()
{
MySQLManager mysql;
ConnectionInfo info;
// 填充ConnectionInfo這個結構體,項目中一般從配置文件這讀取
info.user = "root";
info.password = "your_password";
info.host = "localhost";
info.port = 3306;
info.database = "test";
info.unix_socket = NULL;
info.clientflag = 0;
// mysql連接
if (!mysql.Init(info))
{
return -1;
}
// 增加數據測試
const char* sql1 = "insert into user values (NULL, 'Ada', 'password')";
mysql.ExecuteSql(sql1);
// 刪除數據測試
const char* sql2 = "delete from user where name = 'AceTan'";
mysql.ExecuteSql(sql2);
// 修改數據測試
const char* sql3 = "update user set password='update_password' where name = 'Ada'";
mysql.ExecuteSql(sql3);
// 查詢數據測試
const char* sql4 = "select * from user";
mysql.QueryData(sql4);
mysql.PrintQueryRes();
// 釋放mysql資源
mysql.FreeConnect();
return 0;
}