mysql_init() 初始化連接句柄mysql_real_connect() 建立真實連接mysql_list_dbs() / mysql_query() 執行操作mysql_store_result() 獲取結果集mysql_fetch_row() 逐行讀取mysql_free_result() 釋放結果mysql_close() 關閉連接MYSQL *myData = NULL;
MYSQL_RES *myResult = NULL;
MYSQL_ROW row;
unsigned int num_fields, i;
unsigned long *lengths;
CString str;
m_ListBox.ResetContent();
ASSERT(m_ListBox.GetCount() == 0);
// 1. 初始化並連接 (本地 root 無密碼)
if ((myData = mysql_init(NULL)) &&
mysql_real_connect(myData, NULL, "root", NULL, NULL, MYSQL_PORT, NULL, 0))
{
m_ListBox.AddString(_T("連接成功"));
// 2. 枚舉數據庫
if (myResult = mysql_list_dbs(myData, "%"))
{
m_ListBox.AddString(_T("枚舉數據庫成功"));
num_fields = mysql_num_fields(myResult);
while ((row = mysql_fetch_row(myResult)))
{
lengths = mysql_fetch_lengths(myResult);
for (i = 0; i < num_fields; i++)
{
str.Format(_T("[%.*s]"), lengths[i], row[i] ? row[i] : _T("NULL"));
m_ListBox.AddString(str);
}
}
str.Format(_T("一共有 %d 個數據庫"), (int)mysql_num_rows(myResult));
m_ListBox.AddString(str);
mysql_free_result(myResult);
}
else
{
m_ListBox.AddString(_T("枚舉數據庫失敗"));
}
mysql_close(myData);
}
else
{
m_ListBox.AddString(_T("連接失敗"));
}
| 函數 | 用途 | 備註 |
|---|---|---|
mysql_init() | 分配/初始化 MYSQL 結構 | 傳 NULL 自動分配 |
mysql_real_connect() | 真實建立 TCP 連接 | host=NULL 走本地 socket/管道 |
mysql_query() | 執行 SQL | 返回 0 成功 |
mysql_store_result() | 客戶端緩存完整結果集 | 大結果集慎用,考慮 mysql_use_result() |
mysql_fetch_row() | 取下一行 (字符串數組) | NULL 表示無更多行 |
mysql_fetch_lengths() | 取當前行各列長度 | 處理二進制/含空字符數據必須用 |
mysql_free_result() | 釋放結果集內存 | 必須調用,否則洩漏 |
mysql_close() | 關閉連接並釋放句柄 | 連同 mysql_init 分配的內存 |
mysql_error(myData) 獲取最後錯誤信息mysql_errno(myData) 獲取錯誤碼libmysql.lib,運行時需 libmysql.dll 在 PATH 中mysql_set_character_set(myData, "utf8")新項目推薦使用 MySQL Connector/C++ (JDBC 風格) 或 ODBC,提供 RAII、預編譯、連接池等高級特性,避免手動資源管理風險。