1. 准备工作
(1) 把下面两局代码写进stdafx.h里。位置是倒数第二行,或者#include <afxdisp.h> // MFC 自动化类 这句的后面。(别的位置没试过) (如果改变了位置,要先清理解决方案,再重新生成解决方案)
#import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename ("EOF", "adoEOF")
#import "C:\Program Files\Common Files\system\ado\msadox.dll" rename_namespace("ADOX")
(2)把下面一行代码写进XXX.cpp的InitInstance()函数里,位置是return之前。
if (!AfxOleInit())//这就是MFC初始化COM库
{
AfxMessageBox(_T("OLE初始化出错!"));
}
(3)在XXXDlg.h里添加变量
_ConnectionPtr m_pConnection;
_RecordsetPtr m_pRecordset;
2. 新建数据库
参数是文件路径和文件名的字符串,如:
CreateAccess(_T(".\\xx\\xxx.accdb"));
函数功能:如果存在则提示存在,不存在则创建数据库文件。
void CTestAccessDlg::CreateAccess(CString PathAndAccessName)
{
if (PathFileExists(PathAndAccessName))
{
MessageBox(_T("文件已存在"));
}
else
{
//MessageBox(_T("文件不存在"));
ADOX::_CatalogPtr m_pCatalog = NULL;
_bstr_t ConnectString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source = " + (_bstr_t)PathAndAccessName;
//MessageBox(ConnectString);
try
{
m_pCatalog.CreateInstance(__uuidof(ADOX::Catalog));
m_pCatalog->Create((_bstr_t)ConnectString);
}
catch (_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}
}
}
3.新建数据表
还可写一个获取字段的函数,此处不写了,只写姓名和年龄两个字段
void CTestAccessDlg::OnInitADOConn();
void CTestAccessDlg::CreateAccessTable(CString TableName)
{
_variant_t RecordsAffected;
try
{
_bstr_t bstr1 = "CREATE TABLE ";
_bstr_t bstr2 = (_bstr_t)TableName;
_bstr_t bstr3 = "(姓名 TEXT, 年龄 INTEGER)";
_bstr_t CommandText = bstr1 + bstr2 + bstr3;
m_pConnection->Execute(CommandText, &RecordsAffected, adCmdText);
MessageBox(_T("创建表成功"));
}
catch (_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}
}
void CTestAccessDlg::ExitADOConn();
其中:
void CTestAccessDlg::OnInitADOConn()
{
m_pConnection.CreateInstance(__uuidof(Connection));
_bstr_t ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source = .\\Test.accdb";
try
{
m_pConnection->Open(ConnectionString, "", "", adModeUnknown);
}
catch (_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}
}
void CTestAccessDlg::ExitADOConn()
{
try
{
if (m_pConnection->State)
{
m_pConnection->Close();
}
m_pConnection = NULL;
}
catch (_com_error e)
{
AfxMessageBox(e.ErrorMessage());
}
}