天天看点

MFC新建Access数据库和表(vs2015+Access2016)

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());
	}
}