1. 程式人生 > >VS2010 資料庫操作(基於Access 2013)之二

VS2010 資料庫操作(基於Access 2013)之二

今天中午心血來潮決定優化一下昨天的程式。現在想來這真是個錯誤的決定…
我用了半天的時間來弄,到現在還沒弄好,卻又是食之無味棄之可惜。最後還是把加的程式碼全部刪去了,把原始版發給了老師,哎,我真是自己作啊。
但是,他喵的花了這麼多時間,當做什麼都沒做就太虧了,我得記下來,免得下次遇到這個問題又重新來一遍。胸中一股悶氣<<<

利用VS2010(ADO)獲取Access2013的表名和欄位資訊

獲取表名

第一種方法

    ADO m_Ado;
    m_Ado.OnInitADOConn();//這個函式修改一下,把資料庫的路徑作為輸入。這裡先不動。
    CString strSql;
    strSql = _T("select name from MSysObjects where type=1 and flags=0"
);//sql語句 m_Ado.m_pRecordset = m_Ado.OpenRecordset(strSql);//開啟記錄集 CString strTable; while(!m_Ado.m_pRecordset->adoEOF) { strTable=(char*)(_bstr_t)m_Ado.m_pRecordset->GetFields()->GetItem("Name")->Value; m_table.AddString(strTable);//加入combbox控制元件 } UpdateData(FALSE);//
顯示 m_table.SetCurSel(0);

以上是第一種方法。
但是會報錯,如下:

這裡寫圖片描述

網上搜了一下,原因是程式沒有訪問MSysObjects 表的許可權。

網上有設定該許可權的方法:
1、開啟您的 Access 資料庫,然後在 Access 視窗上選擇:工具 → 選項 → 檢視;
2、將“隱藏物件”和“系統物件”前面的勾選上,可以看到隱藏的一些表出現了;
3、然後繼續選擇:工具 → 安全 → 使用者與組的許可權;
4、在物件名稱中選定 MSysObjects ,然後許可權中設定其許可權。

悲催的是,這個方法只適用於Access 07以下的版本,07之後的版本取消了【使用者與組許可權】這一個功能。
所以,必須把資料庫檔案另存為低版本的access檔案(.mdb),這麼一來,連線字串也必須做更改。

這裡寫圖片描述
這樣設定以後,程式可以運行了,但是又出現了一個問題:
程式卡死了。
除錯中發現,是while迴圈的鍋,好像是無限迴圈了。為什麼會怎樣,!
低階錯誤,沒有加入迴圈的操作(i++)。真的是,我佛了!
在whlie迴圈的最後加入:

m_Ado.m_pRecordset->MoveNext();

然後完美執行!

第二種方法

    m_Ado.m_pRecordset = m_Ado.m_pConnection->OpenSchema(adSchemaTables);//開啟記錄集
    CString strTable;
    while(!m_Ado.m_pRecordset->adoEOF)
    {
        strTable = (char*)(_bstr_t)m_Ado.m_pRecordset->GetFields()->GetItem("TABLE_TYPE")->Value;
        if(strTable == "TABLE")
        {
            CString name=(char*)(_bstr_t)m_Ado.m_pRecordset->GetFields()->GetItem("TABLE_NAME")->Value;
            m_table.AddString(name);
        }
        m_Ado.m_pRecordset->MoveNext();
    }

    m_Ado.CloseRecordset();
    m_Ado.CloseConn();//斷開資料庫連線

獲得表的欄位

    ADO m_Ado;
    m_Ado.OnInitADOConn();//這個函式修改一下,把資料庫的路徑作為輸入。這裡先不動。
    CString strSql,strTable;
    strTable="table1";
    strSql = "select * from " +strTable+" where false";//sql語句
    m_Ado.m_pRecordset = m_Ado.OpenRecordset(strSql);//開啟記錄集

    int nCount=m_Ado.m_pRecordset->GetFields()->Count;
    CString colname;
    long i=0;    //這個地方是long,不然會報錯,吃了虧了
    while(i<nCount)
    {
        colname=(char*)(_bstr_t)m_Ado.m_pRecordset->GetFields()->GetItem(i)->GetName();
        m_list.InsertColumn(i,colname,LVCFMT_LEFT,110,0);
        i++;
    }
    //讀取資料
    AddToGrid(); 

OK,完成!