1,首先,要用#import 语句来引用支持 ADO 的组件类型库(*.tlb),其中类型库可以作为可执
行程序(DLL、EXE 等)的一部分被定位在其自身程序中的附属资源里,如:被定位在
msado15.dll 的附属资源中,只需要直接用#import 引用它既可。可以直接在 Stdafx.h 文件中
加入下面语句来实现:
#import "c:\program files\common files\system\ado\msado15.dll" \
no_namespace \
rename ("EOF", "adoEOF")
其中路径名可以根据自己系统安装的 ADO 支持文件的路径来自行设定。当编译器遇到
#import 语句时,它会为引用组件类型库中的接口生成包装类,#import 语句实际上相当于执
行了 API 涵数 LoadTypeLib()。#import 语句会在
工程
路基工程安全技术交底工程项目施工成本控制工程量增项单年度零星工程技术标正投影法基本原理
可执行程序输出目录中产生两个文件,
分别为*.tlh(类型库头文件)及*.tli(类型库实现文件),它们分别为每一个接口产生智能指针,
并为各种接口方法、枚举类型,CLSID 等进行声明,创建一系列包装方法。语句 no_namespace
说明 ADO 对象不使用命名空间,rename ("EOF", "adoEOF")说明将 ADO 中结束标志 EOF 改
为 adoEOF,以避免和其它库中命名相冲突。
2,其次,在程序初始过程中需要初始化组件,一般可以用 CoInitialize(NULL);来实现,这种
方法在结束时要关闭初始化的 COM,可以用下面语句 CoUnInitialize();来实现。在 MFC 中
还可以采用另一种方法来实现初始化 COM,这种方法只需要一条语句便可以自动为我们实
现初始化 COM 和结束时关闭 COM 的操作,语句如下所示:
AfxOleInit();
接着,就可以直接使用 ADO 的操作了。
3,再次,我们经常使用的只是前面用#import 语句引用类型库时,生成的包装类.tlh 中声明的
智能指针中的三个,它们分别是_ConnectionPtr、_RecordsetPtr 和_CommandPtr。下面分别对
它们的使用方法进行介绍:
_ConnectionPtr 智能指针,通常用于打开、关闭一个库连接或用它的 Execute 方
法来执行一个不返回结果的命令语句(用法和_CommandPtr 中的 Execute 方法类似)。
1——打开一个库连接。
先创建一个实例指针,再用 Open 打开一个库连接,它将返回一个 IUnknown 的自动化
接口指针。代码如下所示:
_ConnectionPtr m_pConnection;(实例指针)
// 初始化 COM,创建 ADO 连接等操作
AfxOleInit();
m_pConnection.CreateInstance(__uuidof(Connection));
// 在 ADO 操作中建议语句中要常用 try...catch()来捕获错误信息,
// 因为它有时会经常出现一些意想不到的错误。jingzhou xu
try
{
// 打开本地 Access 库 Demo.mdb
m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;DataSource=Demo.
mdb","","",adModeUnknown);
}
catch(_com_error e)
{
AfxMessageBox("数据库连接失败,确认数据库 Demo.mdb 是否在当前路径
下!");
return FALSE;
}
2——关闭一个库连接。
如果连接状态有效,则用 Close 方法关闭它并赋于它空值。代码如下所示:
if(m_pConnection->State)
m_pConnection->Close();
m_pConnection= NULL;
_RecordsetPtr 智能指针,可以用来打开库内数据
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
,并可以对表内的
记录
混凝土 养护记录下载土方回填监理旁站记录免费下载集备记录下载集备记录下载集备记录下载
、字段
等进行各种操作。(对表内数据进行操作)
1——打开数据表。
打开库内表名为 DemoTable 的数据表,代码如下:
_RecordsetPtr m_pRecordset;(实例指针)
m_pRecordset.CreateInstance(__uuidof(Recordset));
// 在 ADO 操作中建议语句中要常用 try...catch()来捕获错误信息,
// 因为它有时会经常出现一些意想不到的错误。jingzhou xu
try
{
m_pRecordset->Open("SELECT * FROM DemoTable", // 查询
DemoTable 表中所有字段
theApp.m_pConnection.GetInterfacePtr(), // 获取库接库
的 IDispatch 指针
adOpenDynamic,
adLockOptimistic,
adCmdText);
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}
2——读取表内数据。
将表内数据全部读出并显示在列表框内,m_AccessList 为列表框的成员变量名。如果没
有遇到表结束标志 adoEOF,则用 GetCollect(字段名)或 m_pRecordset->Fields->GetItem(字段
名)->Value 方法,来获取当前记录指针所指的字段值,然后再用 MoveNext()方法移动到下一
条记录位置。代码如下所示:
_variant_t var;
CString strName,strAge;
try
{
if(!m_pRecordset->BOF)
m_pRecordset->MoveFirst();
else
{
AfxMessageBox("表内数据为空");
return;
}
// 读入库中各字段并加入列表框中
while(!m_pRecordset->adoEOF)
{
var = m_pRecordset->GetCollect("Name");
if(var.vt != VT_NULL)
strName = (LPCSTR)_bstr_t(var);
var = m_pRecordset->GetCollect("Age");
if(var.vt != VT_NULL)
strAge = (LPCSTR)_bstr_t(var);
m_AccessList.AddString( strName + " --> "+strAge );
m_pRecordset->MoveNext();
}
// 默认列表指向第一项,同时移动记录指针并显示
m_AccessList.SetCurSel(0);
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}
3——插入记录。
可以先用 AddNew()方法新增一个空记录,再用 PutCollect(字段名,值)输入每个字段的
值,最后再 Update()更新到库中数据既可。其中变量 m_Name 和 m_Age 分别为姓名及年龄
编辑框的成员变量名。代码所下所示:
try
{
// 写入各字段值
m_pRecordset->AddNew();
m_pRecordset->PutCollect("Name", _variant_t(m_Name));
m_pRecordset->PutCollect("Age", atol(m_Age));
m_pRecordset->Update();
AfxMessageBox("插入成功!");
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}
4——移动记录指针。
移动记录指针可以通过 MoveFirst()方法移动到第一条记录、MoveLast()方法移动到最后
一条记录、MovePrevious()方法移动到当前记录的前一条记录、MoveNext()方法移动到当前
记录的下一条记录。但我们有时经常需要随意移动记录指针到任意记录位置时,可以使用
Move(记录号)方法来实现,注意: Move()方法是相对于当前记录来移动指针位置的,正值向
后移动、负值向前移动,如:Move(3),当前记录是 3 时,它将从记录 3 开始往后再移动 3
条记录位置。代码如下所示:
try
{
int curSel = m_AccessList.GetCurSel();
// 先将指针移向第一条记录,然后就可以相对第一条记录来随意移动记
录指针
m_pRecordset->MoveFirst();
m_pRecordset->Move(long(curSel));
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}
5——修改记录中字段值。
可以将记录指针移动到要修改记录的位置处,直接用 PutCollect(字段名,值)将新值写
入并 Update()更新数据库既可。可以用上面方法移动记录指针,修改字段值代码如下所示:
try
{
// 假设对第二条记录进行修改
m_pRecordset->MoveFirst();
m_pRecordset->Move(1); // 从 0 开始
m_pRecordset->PutCollect("Name", _variant_t(m_Name));
m_pRecordset->PutCollect("Age", atol(m_Age));
m_pRecordset->Update();
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}
6——删除记录。
删除记录和上面修改记录的操作类似,先将记录指针移动到要修改记录的位置,直接用
Delete()方法删除它并用 Update()来更新数据库既可。代码如下所示:
try
{
// 假设删除第二条记录
m_pRecordset->MoveFirst();
m_pRecordset->Move(1); // 从 0 开始
m_pRecordset->Delete(adAffectCurrent); // 参数 adAffectCurrent 为删除
当前记录
m_pRecordset->Update();
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}
7——关闭记录集。
直接用 Close 方法关闭记录集并赋于其空值。代码如下所示:
m_pRecordset->Close();
m_pRecordset = NULL;
_CommandPtr 智能指针,可以使用_ConnectionPtr 或_RecordsetPtr 来执行任务,
定义输出参数,执行存储过程或 SQL 语句。
1——执行 SQL 语句。
先创建一个_CommandPtr 实例指针,再将库连接和 SQL 语句做为参数,执行 Execute()
方法既可。代码如下所示:
_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
语句,返回记录集
2——执行存储过程。
执行存储过程的操作和上面执行 SQL 语句类似,不同点仅是 CommandText 参数中不再
是 SQL 语句,而是存储过程的名字,如 Demo。另一个不同点就是在 Execute()中参数由
adCmdText(执行 SQL 语句),改为 adCmdStoredProc 来执行存储过程。如果存储过程中存在
输入、输出参数的话,需要使用到另一个智能指针_ParameterPtr 来逐次设置要输入、输出的
参数信息,并将其赋于_CommandPtr 中 Parameters 参数来传递信息,有兴趣的读者可以自行
查找相关书籍或 MSDN。执行存储过程的代码如下所示:
_CommandPtr m_pCommand;
m_pCommand.CreateInstance(__uuidof(Command));
m_pCommand->ActiveConnection = m_pConnection; // 将库连接赋于它
m_pCommand->CommandText = "Demo";
m_pCommand->Execute(NULL,NULL, adCmdStoredProc);
//////////////////////////////////////////////////////////////////////
注,数据库的名字为 demo.mdb,其中表名为 DemoTable,表内字段名为 Name(姓名)和 Age(年
龄)的两个字段,为 Access 数据库