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、其他