Win32 Sdk 連接Access數據庫
/************************************************************* *** MyWinClass.cpp 創建窗口模板 *** vs2017+Access2007 **************************************************************/ #import "c://program files//common files//system//ado//msado15.dll" no_namespace rename("EOF","adoEOF") //導入ADO庫 #include <Windows.h> #include <tchar.h> #include <comutil.h> #include <commctrl.h> #include "resource.h" // 必須要進行前導聲明 INT_PTR CALLBACK WindowProc(_In_ HWND hwnd, _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam); void LoadDataToListCtrl(HWND hDlg); // 程序入口點 int WINAPI WinMain( _In_ HINSTANCE hInstance, _In_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nCmdShow ) { // 創建窗口 HWND hwnd = CreateDialog(hInstance, (LPCTSTR)IDD_DIALOG1, NULL, WindowProc); if (hwnd == NULL) //檢查窗口是否創建成功,回調函數要返回個0,不然創建不會成功 return 0; // 顯示窗口 ShowWindow(hwnd, SW_SHOW); // 更新窗口 UpdateWindow(hwnd); // 消息循環 MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return 0; }
// 在WinMain後實現 INT_PTR CALLBACK WindowProc( _In_ HWND hwnd, _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam) { HDC hdc; RECT rect; PAINTSTRUCT ps; //int k; switch (uMsg) { /*case WM_SYSCOMMAND: break;*/ case WM_INITDIALOG: { LoadDataToListCtrl(hwnd); return 0; } case WM_DESTROY: PostQuitMessage(0); return 0; case WM_CLOSE: if (MessageBox(hwnd, L"請問是否真的要關閉窗口?", L"窗口關閉詢問", MB_YESNO) == IDYES) { DestroyWindow(hwnd); return 0; } else return 0; case WM_LBUTTONDOWN: { //MessageBox(hwnd, L"哎呀,我丫的被按了一下", TEXT("好舒服~"), MB_OK); return 0; } case WM_PAINT: hdc = BeginPaint(hwnd, &ps); GetClientRect(hwnd, &rect); DrawText(hdc, L"Hello world!", -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); EndPaint(hwnd, &ps); return 0; } return false; } //加載數據庫數據到ListCtrl控件中 void LoadDataToListCtrl(HWND hDlg) { //查詢數據庫文件是否存在 LPCTSTR DatabaseFile = L"D:\\MyAccessFile\\myTonxilu.accdb"; WIN32_FIND_DATA wfd; HANDLE hFile = FindFirstFile(DatabaseFile, &wfd); if (hFile == INVALID_HANDLE_VALUE) { wprintf_s(L"Cannot Find the database file/n");//這名是啥意思,我也不知道,俺是抄的(: //system("pause"); return; }
//初始化ADO環境 CoInitialize(NULL);
//創建數據庫連接對像,並打開 _ConnectionPtr m_Connection; m_Connection.CreateInstance(__uuidof(Connection)); HRESULT hr = m_Connection->Open(_bstr_t("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\\MyAccessFile\\myTonxilu.accdb"), _bstr_t(""), _bstr_t(""), adModeUnknown); if (hr != S_OK) return; //連接記錄集 _RecordsetPtr m_Recordset; m_Recordset.CreateInstance(__uuidof(Recordset)); HRESULT hRs = m_Recordset->Open(_variant_t(L"select * from mTable"), m_Connection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText); if (hRs != S_OK) return; //獲得ListCtrl控件的句柄 HWND hList = GetDlgItem(hDlg, IDC_LIST1);
//設置風格樣式 SendMessage(hList, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT); RECT rt; ::GetClientRect(hList, &rt); int nListWith = rt.right - 20; //獲得控件的寬度
//插入列標題 LVCOLUMN col = { 0 }; col.mask = LVCF_TEXT | LVCF_FMT | LVCF_WIDTH; col.pszText = (LPTSTR)L"編號"; col.fmt = LVCFMT_LEFT; // 列文字排列樣式,居左,中,右 col.cx = (int)(0.2*nListWith);// 列的寬度 col.iSubItem = 0; SendMessage(hList, LVM_INSERTCOLUMN, 0, (LPARAM)&col); col.iSubItem = 1; col.pszText = (LPTSTR)L"姓名"; col.cx = (int)(0.2*nListWith); SendMessage(hList, LVM_INSERTCOLUMN, 1, (LPARAM)&col); col.iSubItem = 2; col.pszText = (LPTSTR)L"性別"; col.cx = (int)(0.15*nListWith); SendMessage(hList, LVM_INSERTCOLUMN, 2, (LPARAM)&col); //循環加入行數據
int i = 0;
while (!m_Recordset->adoEOF)
{
LVITEM lv = { 0 };
lv.mask = LVCF_TEXT | LVCF_FM ;
lv.iItem = i;
lv.iSubItem = 0; TCHAR str[256]; _stprintf_s(str, L"%s", (LPCTSTR)_bstr_t(m_Recordset->GetCollect(_T("ID")))); lv.pszText = str; SendMessage(hList, LVM_INSERTITEM, i, (LPARAM)&lv); lv.iSubItem = 1; _stprintf_s(str, L"%s", (LPCTSTR)_bstr_t(m_Recordset->GetCollect(_T("mName")))); lv.pszText = str; SendMessage(hList, LVM_SETITEMTEXT, i, (LPARAM)&lv); lv.iSubItem = 2; _stprintf_s(str, L"%s", (LPCTSTR)_bstr_t(m_Recordset->GetCollect(_T("mSex")))); lv.pszText = str; SendMessage(hList, LVM_SETITEMTEXT, i, (LPARAM)&lv); m_Recordset->MoveNext(); i++; }
//關閉記錄集並釋放資源 m_Recordset->Close(); m_Recordset.Release(); m_Recordset = NULL;
//關閉數據庫連接並釋放資源 m_Connection->Close(); m_Connection.Release(); m_Connection = NULL;
//釋放環境 CoUninitialize(); }
我用的是Vs2017和Access2007數據庫寫的.