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();
浙公网安备 33010602011771号