VC连接数据库的基本步骤如下:
1、增加支持头文件,引用支持组件
    在stdafx.h的所有include后面加入如下代码

#include <icrsint.h>
 #include <basetsd.h>
 #include <ole2.h>
 #import "c:\program files\common files\system\ado\msado15.dll" \
 no_namespace rename("EOF","adoEOF")


注意引用的动态库路径,它跟安装access时选的路径有关,不一定全是上面这个。
2、初始化组件
    有两种方式:一般可以用CoInitialize(NULL);来实现,这种方法在结束时要关闭初始化的COM,可以用下面语句CoUnInitialize();来实现。在MFC中还可以采用另一种方法来实现初始化COM,这种方法只需要一条语句便可以自动为我们实现初始化COM和结束时关闭COM的操作,语句如下所示: AfxOleInit();
    在使用组件指针之前初始化,也可以在App::InitInstance()中写入AfxOleInit();
3、实例指针

_ConnectionPtr m_pConnection("ADODB.Connection");
                                                                _RecordsetPtr m_pRecordset("ADODB.Recordset");


    1)、_ConnectionPtr智能指针,通常用于打开、关闭一个库连接或用它的Execute方法来执行一个不返回结果的命令语句
    2)、_RecordsetPtr智能指针,可以用来打开库内数据表,并可以对表内的记录、字段等进行各种操作。
    3)、CommandPtr智能指针,可以使用_ConnectionPtr或_RecordsetPtr来执行任务,定义输出参数,执行存储过程或SQL语句。 
也可以使用CreateInstance()来初始化:


_CommandPtr		m_pCommand;
m_pCommand.CreateInstance(__uuidof(Command));
m_pCommand->ActiveConnection = m_pConnection;  // 将库连接赋于它
m_pCommand->CommandText = "SELECT * FROM DemoTable";  // SQL语句
m_pRecordset = m_pCommand->Execute(NULL, NULL,adCmdText); // 执行SQL语句,返回记录集


——执行存储过程。执行存储过程的操作和上面执行SQL语句类似,不同点仅是CommandText参数中不再是SQL语句,而是存储过程的名字,如Demo。另一个不同点就是在Execute()中参数由adCmdText(执行SQL语句),改为adCmdStoredProc来执行存储过程。如果存储过程中存在输入、输出参数的话,需要使用到另一个智能指针_ParameterPtr来逐次设置要输入、输出的参数信息



4、打开数据库


在ADO操作中建议语句中要常用try...catch()来捕获错误信息

try                 
{	
	// 打开本地Access库Demo.mdb
	m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Demo.mdb","","",adModeUnknown);
        //如果数据库有密码,则为:m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=JyDB.mdb;Jet OLEDB:Database Password = jy_agt&pwd","","",adModeUnknown);注:密码处OLEDB:Database的冒号前后皆不能有空格,不然会连接失败
}
catch(_com_error e)
{
	AfxMessageBox("数据库连接失败,确认数据库Demo.mdb是否在当前路径下!");
	return FALSE;
}



5、打开数据表及操作表中数据


try
{
	m_pRecordset->Open("SELECT * FROM DemoTable",                // 查询DemoTable表中所有字段
			   theApp.m_pConnection.GetInterfacePtr(),	 // 获取库接库的IDispatch指针
			   adOpenDynamic,
			   adLockOptimistic,
			   adCmdText);
}
catch(_com_error *e)
{
	AfxMessageBox(e->ErrorMessage());
}


获取数据库中的值:

_variant_t  var;
 CString testValue = "";
 try
 {
     if(!m_pRecordSet->BOF)
     {
        m_pRecordSet.MoveFirst();
     }
     else
     {
        AfxMessageBox("表内数据为空.");
     }
 //获取第一行ParamType列的数据
    var = m_pRecordSet.GetCollect("ParamType")
    if(var.vt != VT_NULL)
    {
       testValue = (LPCSTR)_bstr_t(var);
    }
 }


6、关闭连接


关闭一个库连接。如果连接状态有效,则用Close方法关闭它并赋于它空值。代码如下所示:


if(m_pConnection->State)
        m_pConnection->Close();
m_pConnection= NULL;    //或者用 m_pConnection.Release()也行,但注意不是->


7、其他