MFC连接Access

1. 导入dll,使用命名空间。


a.在stdafx.h里加入如下语句:

#import "C:\Program Files\Common Files\System\ADO\msado15.dll" rename("EOF","adoEOF"), rename("BOF","adoBOF")



b.在需要使用的文件里使用命名空间

using namespace ADODB;



c.在使用之前加上

CoInitialize(NULL);

使其初始化。否则提示空指针错误。

2. 连接。

a.新建一个_ConnectionPtr类型的变量

m_conn.CreateInstance(__uuidof(Connection));

b.connStr连接字符串书写:

//03使用
//conStr = _T("Provider=Microsoft.Jet.OLEDB.4.0;")
//	 _T("Data Source=e:\\MSC\\trunk\\MSPMS\\Database\\TreeGroup\\TreeGroup.accdb;")
//	 _T("Jet OLEDB:Database Password=");
	
//07
	conStr = _T("Provider=Microsoft.ACE.OLEDB.12.0;")
	_T("Data Source=e:\\MSC\\trunk\\MSPMS\\Database\\TreeGroup\\TreeGroup.accdb;")
	_T("Jet OLEDB:Database Password=");

  

c.调用Open函数,

m_conn->Open(connStr,"","",-1);



3. 查询并返回结果。

建立一个结果集变量

_RecordsetPtr Ptr = NULL;
Ptr.CreateInstance(__uuidof(Recordset));

构造sql语句:

CString sql = _T("SELECT* FROM GroupManage");
_bstr_t sqlToExecute = sql;//可直接转换!

执行sql语句:

Ptr = m_conn->Execute(sqlToExecute,NULL,adCmdText);

从结果集取数据:

_variant_t roader;
roader = Ptr->GetCollect(_T("gName"));

4. 关闭连接

m_conn.Close();

5. 需要注意的几个地方:


1. 连接与查询都需要使用try...catch...结构。
2. 错误信息的可以用MessageBox打印出来,代码如下:
3. Group是数据库保留的关键字,用来当表名的话会导致IDispatch error #3092的错误。

 

一个完整的过程如下:

   //连接
	CString conStr;

	//03使用
	//conStr = _T("Provider=Microsoft.Jet.OLEDB.4.0;")
	//		 _T("Data Source=e:\\MSC\\trunk\\MSPMS\\Database\\TreeGroup\\TreeGroup.accdb;")
	//		 _T("Jet OLEDB:Database Password=");
	
	//07
	conStr = _T("Provider=Microsoft.ACE.OLEDB.12.0;")
			 _T("Data Source=e:\\MSC\\trunk\\MSPMS\\Database\\TreeGroup\\TreeGroup.accdb;")
			 _T("Jet OLEDB:Database Password=");

	try
	{
		m_conn.CreateInstance(__uuidof(Connection));
		_bstr_t conStr_=conStr;
		m_conn->Open(conStr_,"","",-1);
	}
	catch(_com_error& e)
	{

		CString errormessage;
		errormessage.Format(_T("连接StatusT.mdb数据库失败!\r\n错误信息:%s"),e.ErrorMessage());
		MessageBox(errormessage);
		return ;
	}

	//查询
	CString sql = _T("SELECT* FROM GroupManage");
	_bstr_t sqlToExecute = sql;

	//1.新建结果集,并将其值赋为空
	_RecordsetPtr Ptr = NULL;

	//2.try...catch...结构来进行读取数据
	try
	{
		Ptr.CreateInstance(__uuidof(Recordset));
		Ptr = m_conn->Execute(sqlToExecute,NULL,adCmdText);
		_variant_t roader;
		while(!Ptr->adoEOF)//读取gName字段,并依次弹出MsgBox显示
		{
			roader = Ptr->GetCollect(_T("gName"));
			if(roader.vt != VT_NULL)
			{
				MessageBox((LPCTSTR)(_bstr_t)roader);
			}
			Ptr->MoveNext();
		}
		Ptr->Close();
	}
	catch(_com_error& e)
	{
		CString errorMsg;
		errorMsg.Format(_T("错误信息是:%s"),e.ErrorMessage());
		MessageBox(errorMsg);
		return ;
	} 

	//关闭连接
	m_conn->Close();

  

posted on 2011-12-01 11:03  LateStop  阅读(4709)  评论(0)    收藏  举报

导航