利用 ADO OpenSchema 方法搭配 adSchemaTables 列舉資料庫結構描述,篩選 TABLE_TYPE = "TABLE" 即可取得所有使用者建立的資料表名稱(排除系統表、檢視表等)。
#include <icrsint.h>
#include <basetsd.h>
#include <ole2.h>
#import "C:\\Program Files\\Common Files\\System\\ADO\\msado15.dll" \
no_namespace rename("EOF", "EndOfFile")
class CMyDialog : public CDialog
{
// ...
CListBox m_strList; // 顯示資料表名稱
};
CMyDialog::CMyDialog()
{
::CoInitialize(NULL); // 初始化 COM 程式庫
}
void OpenSchemaX(TCHAR* TableName) // TableName 為 .mdb 完整路徑
{
HRESULT hr = S_OK;
::CoInitialize(NULL);
IADORecordBinding* picRs = NULL;
_RecordsetPtr pRstSchema("ADODB.Recordset");
_ConnectionPtr pConnection("ADODB.Connection");
try
{
// 設定連線字串
pConnection->ConnectionString = TableName;
pConnection->Provider = "Microsoft.Jet.OLEDB.4.0";
pConnection->Open(pConnection->ConnectionString, "", "", adModeUnknown);
// 取得 RecordBinding 介面(可選,用於強型別繫結)
pRstSchema->QueryInterface(__uuidof(IADORecordBinding), (LPVOID*)&picRs);
// 關鍵:開啟資料表結構描述
pRstSchema = pConnection->OpenSchema(adSchemaTables);
while (!(pRstSchema->EndOfFile))
{
_bstr_t table_name = pRstSchema->Fields->GetItem("TABLE_NAME")->Value;
_bstr_t table_type = pRstSchema->Fields->GetItem("TABLE_TYPE")->Value;
CString strTableType((LPCSTR)table_type);
if (strTableType == _T("TABLE")) // 僅保留使用者資料表
{
m_strList.AddString((LPCSTR)table_name);
}
pRstSchema->MoveNext();
}
pRstSchema->Close();
pConnection->Close();
}
catch (_com_error& e)
{
// 錯誤處理:印出 Provider 錯誤與 COM 錯誤
PrintProviderError(pConnection);
PrintComError(e);
}
::CoUninitialize();
}
adSchemaTables:列舉資料表、檢視、系統表等結構描述。TABLE_TYPE 欄位值:"TABLE"(使用者表)、"VIEW"、"SYSTEM TABLE"、"ALIAS" 等。_bstr_t:智慧型 BSTR 包裝類別,自動管理記憶體並支援轉換為 CString。CoInitialize/CoUninitialize:每個執行緒呼叫 COM 前必須初始化,結束時釋放。_com_error 捕捉 ADO/COM 例外。OpenSchema(adSchemaColumns, ...) 並篩選 TABLE_NAME。adSchemaIndexes、adSchemaPrimaryKeys、adSchemaForeignKeys。SQLOLEDB,連線字串調整為 Data Source=...;Initial Catalog=...;UID=...;PWD=...。此技術適用於資料庫工具、動態建構查詢介面、匯出/匯入精靈等需自動發現資料表結構的場合。