1. 程式人生 > >C++ MFC 連線資料庫(附原始碼)

C++ MFC 連線資料庫(附原始碼)

連線資料庫幾種方式:

  • SQL SERVER
  • ODBC
  • OLE DB
  • MYSQL

一、MySQL

這裡介紹如何連線MySQL資料庫,使用的是MySQLworkbench6.3版本,其他版本也可以,安裝過程百度

1、表定義

開發平臺

這裡使用的是vs2008版本,建議2010版本,用visualC++也可以,根據情況匯入。

介面:

程式碼

自定義了一個CDatabase類,實現資料庫操作的封裝。

mysql.h等資料庫檔案見原始碼。

#include "StdAfx.h"
#include "MFCDlg.h"
#include <cstring> 
#include <string> 
#include "CDatabase.h"

// 建構函式初始化MYSQL物件
CDatabase::CDatabase()
{
	mysql_init(&mysql);
}

// 解構函式
CDatabase::~CDatabase()
{
	Close();
	mysql_library_end();
}

// 關閉資料庫連線
void CDatabase::Close()
{
	if(query)	mysql_free_result(query);
	mysql_close(&mysql);
}

// 開啟資料庫
bool CDatabase::Open(char* host, char* user, char* pass, char* db)
{
	CString  error;
	if(!mysql_real_connect(&mysql, host, user, pass, db, 3306, NULL, 0))
	{ 		
		error = mysql_error(&mysql);
		AfxMessageBox(error);
		//printf("執行查詢操作失敗。錯誤原因: %s\n",  mysql_error(&mysql));		
		return false;
	}
	return true;
}

//選擇記錄
bool CDatabase::Execute(char* sql)
{
	if(mysql_real_query(&mysql, sql, strlen(sql)))	return false;
	query = mysql_use_result(&mysql);
	return true;
}
//設定編碼
void CDatabase::SetCode()
{
	//mysql_set_character_set(&mysql, "utf8");
	AfxMessageBox("成功");
}
//獲取欄位個數
int CDatabase::GetFieldNum()
{
	if (query) return mysql_num_fields(query);
	return 0;
}

//獲取記錄行
MYSQL_ROW CDatabase::GetRecord()
{
	if (query) 
	{
		row = mysql_fetch_row(query);
		return row;
	}
	return NULL;
}

// 獲取記錄集
void CDatabase::GetRecords()
{
	query = mysql_use_result(&mysql);
}

// 獲取記錄集欄位值的長度
unsigned long * CDatabase::GetRecordFieldLength()
{
	if (query) return mysql_fetch_lengths(query);
	return NULL;
}
// 顯示查詢結果集
bool CDatabase::ShowRecords(char* sql)
{
	// 執行查詢操作
	if (!Execute(sql)) return FALSE;


	unsigned int nFields = GetFieldNum();

	CEdit* pWnd = (CEdit*)AfxGetApp()->m_pMainWnd->GetDlgItem(IDC_EDIT1);
	while ((row = GetRecord()))
	{
		unsigned long *lengths;
		lengths = GetRecordFieldLength();
		for(UINT i = 0; i < nFields; i++)
		{
			//printf("[%.*s] ", (int) lengths[i], row[i] ? row[i] : "NULL");
			char *s = new char[200];
			sprintf(s,"%.*s ", (int) lengths[i], row[i] ? row[i] : "NULL");
			
			//CMFCDlg myDialog = new CMFCDlg();
			//((CEdit*)myDialog.GetDlgItem(IDC_EDIT1))->SetWindowText(_T("xxxx"));
			//myDialog->SetWindowText("123")
			int nLength=pWnd->SendMessage(WM_GETTEXTLENGTH);  
			pWnd->SetSel(nLength,  nLength);  
			pWnd->ReplaceSel(s);
			/*m.setedit(s);*/
		}
		//printf("\n");
	}

	//printf("--------------------------------------------------\n");
	return TRUE;
}