VS2010 資料庫操作(基於Access 2013)之二
阿新 • • 發佈:2019-01-25
今天中午心血來潮決定優化一下昨天的程式。現在想來這真是個錯誤的決定…
我用了半天的時間來弄,到現在還沒弄好,卻又是食之無味棄之可惜。最後還是把加的程式碼全部刪去了,把原始版發給了老師,哎,我真是自己作啊。
但是,他喵的花了這麼多時間,當做什麼都沒做就太虧了,我得記下來,免得下次遇到這個問題又重新來一遍。胸中一股悶氣<<<
利用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,完成!