本文描述如何在VC下動態創建Access數據庫(mdb)文件,方法是用ADO和ADOX來操作數據庫,操作環境為winxp/VC6.0/Access2000。具體方法如下。
使用ADO前必須在工程的stdafx.h文件最後用直接引入符號#import引入ADO庫文件,以使編譯器能正確編譯。代碼如下:
#import "C:Program Filescommon filessystemadomsado15.dll" no_namespace rename("EOF","adoEOF")
ADO類的定義是作為一種資源存儲在ADO DLL(msado15.dll)中,在其內部稱為類型庫。類型庫描述了自治接口,以及C++使用的COM vtable接口。當使用#import指令時,在運行時Visual C++需要從ADO DLL中讀取這個類型庫,並以此創建一組C++頭文件。這些頭文件具有.tli 和.tlh擴展名,讀者可以在項目的目錄下找到這兩個文件。在C++程序代碼中調用的ADO類要在這些文件中定義。
程序的第三列指示ADO對象不使用名稱空間。在有些應用程序中,由於應用程序中的對象與ADO中的對象之間可能會出現命名沖突,所以有必要使用名稱空間。如果要使用名稱空間,則可把第三行程序修改為: rename_namespace("AdoNS")。第四行代碼將ADO中的EOF(文件結束)更名為adoEOF,以避免與定義了自己的EOF的其他庫沖突。 這裡直接引用一程序當中的一個函數作為例子來說明。
BOOL CConvertmdbDlg::Createmdb()
{
WIN32_FIND_DATA fd;
HANDLE hFind = FindFirstFile(m_mdbpath, &fd);
if (hFind != INVALID_HANDLE_VALUE)
return TRUE;
::CoInitialize(NULL);
HRESULT hr = S_OK;
try
{
ADOX::_CatalogPtr pCatalog = NULL;
hr = pCatalog.CreateInstance(__uuidof (ADOX::Catalog));
if(FAILED(hr))
{
_com_issue_error(hr);
}
else
{
pCatalog->Create(_bstr_t(m_strconn)); //Create mdb
}
//Create table
m_pConn.CreateInstance(__uuidof(Connection));
m_pConn->Open(_bstr_t(m_strconn), "", "", adConnectUnspecifIEd);
_variant_t RecordsAffected;
CString strSql;
BSTR bstrSQL;
strSql = _T("CREATE TABLE AXISSave(ID INTEGER,X_Axis REAL,
Y_Axis REAL,TestResult INTEGER)");
bstrSQL = strSql.AllocSysString();
m_pConn->Execute(bstrSQL, &RecordsAffected, adCmdText);
}
catch(_com_error &e)
{
AfxMessageBox(e.ErrorMessage());
m_pConn = NULL;
::CoUninitialize();
return FALSE;
}
m_pConn->Close();
m_pConn = NULL;
::CoUninitialize();
return TRUE;
}
看如下語句
ADOX::_CatalogPtr pCatalog = NULL;
hr = pCatalog.CreateInstance(__uuidof (ADOX::Catalog));
if(FAILED(hr))
{
_com_issue_error(hr);
}
else
{
pCatalog->Create(_bstr_t(m_strconn)); //Create mdb
}
上面就是動態創建mdb文件的語句,其中m_strconn為如下格式的字符串,比如:
pCatalog->Create(_bstr_t("Provider=Microsoft.JET.OLEDB.4.0;Data source=C:\test.mdb"));
將在C盤跟目錄下創建一個test.mdb文件
strSql = _T("CREATE TABLE AXISSave(ID INTEGER,X_Axis REAL,
Y_Axis REAL,TestResult INTEGER)");
bstrSQL = strSql.AllocSysString();
m_pConn->Execute(bstrSQL, &RecordsAffected, adCmdText);
上面語句就是動態創建test.mdb數據庫中表的核心語句,它是利用Connection對象的Execute方法來執行SQL命令
上面例子創建一個名為AXISSave,字段分別為ID,X_Axis,Y_Axis,TestResult的表,注意不能創建字段index
創建之後就可以利用ADO庫三個智能指針:_ConnectionPtr、_CommandPtr和_RecordsetPtr進行數據庫的操作