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數據庫寫的.

 

Tags: