分享

在Visual C++中使用ADO

 笔录收藏 2017-02-20
在Visual C++中,要使用ADO对象,必须先在类的头文件中导入ADO的库文件,并包含头文件icrsint.h。

ADO数据绑定对话框向导可自动导入ADO对象库,并包含icrsint.h。在对象Visual C++中,CADORecordBinding类实现了如何在Visual C++中使用ADO对象。ADO数据绑定对话框向导建立了一个CADORecordBinding类的派生类CCustomRs。CCustomRs类定 义了与制定数据库表字段对应的数据成员,并将数据成员绑定到字段。
在CCustomRs类头文件RsCgDlg.h的头部,导入了ADO库:

#import "C:/Program Files/Common Files/system/ado/msado15.dll" rename_namespace("ADOCG") rename("EOF", "EndOfFile")
using namespace ADOCG;
#include "icrsint.h"

然后,向导定义了一个CRsCgDlg类,该类继承了CDialog(对话框类)和CCustomRs。CRsCgDlg类定义了一个记录集对象指针m_pRs,如下:

_RecordsetPtr m_pRs;

_RecordsetPtr在CADORecordBinding类中被定义为ADO的Recordset对象指针。通过m_pRs即可在对话框中使用ADO的Recordset对象访问数据库。
1.打开记录集
首先要创建一个Connection对象实例,然后执行Open方法打开记录集。例如:

m_strConnection = _T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C://Documents and Settings//Administrator//桌面  //File.mdb;Persist Security Info=False");                                   //定义连接字符串
m_strCmdText = _T("F1");//定义命令文本内容
m_pRs.CreateInstance(__uuidof(Recordset)); //创建Connection对象实例
m_pRs->CursorLocation = adUseClient;         //设置游标位置
m_pRs->Open((LPCTSTR)m_strCmdText,      //命令文本内容
(LPCTSTR)m_strConnection,                         //连接字符串
adOpenKeyset,                                            //设置游标类型
adLockReadOnly,                                         //设置锁定类型
adCmdTableDirect);                                     //设置命令类型

2.游标位置
Connection对象的CursorLocation属性用于设置或返回游标位置,常数adUseClient表示使用本地游标库提供的客户端游标。adUseServer表示使用数据提供者或驱动程序提供的游标,为默认值。

3.游标类型
游标类型决定了记录集是否可读写以及记录滚动方式。游标类型常量有:
adOpenForwardOnly 仅向前游标,默认值。只能在记录中向前滚动
adOpenKeyset    键集游标。记录集不能访问其他用户删除的记录,无法查看其他用户添加 

                        的记录,可看见其他用户更改的数据

adOpenDynamic  动态游标。可看见其他用户所作的添加、更改和删除。允许在记录集中进

                        行所有类型的移动。
adOpenStatic     静态游标。记录集用于查找数据或生成报告。对其他用户所作的添加、更改

                        或删除不可见。

4.锁定类型
锁定类型决定记录集如何对记录加锁。锁定类型常量有:
adLockReadOnly    默认值,只读。无法更改数据。
adLockPessimistic  保守式逐条记录锁定。为确保成功编辑记录,采用编辑时立即锁定数据源

                           的记录。
adLockOptimistic   开放式逐条记录锁定。只有在调用Update方法时锁定记录。
adLockBatchOptimistic  开放式批更新,只在调用UpdateBatch方法时锁定记录。

5.命令类型
命令类型用于决定提供者如何解释CommandText属性设置的命令文本,命令类型常量有:
AdCmdText                 将CommandText解释为命令或存储过程调用
AdCmdTable                将CommandText解释为数据库查询的名称
AdCmdTableDirect        将CommandText解释为数据库表的名称
AdCmdStoredProc        将CommandText解释为存储过程名称
AdCmdUnknown           默认值。将CommandText解释为未知的命令类型
AdCommandFile            将CommandText解释为持久Recordset文件名
AdExecuteNoRecords    将CommandText解释为不返回行的命令或存储过程

6.连接字符串
连接字符串用于指定数据提供者、数据库服务器、数据库、用户名好口令等连接信息。常用的数据提供者有:
MSDASQL          访问ODBC数据源的OLE DB提供者
MSIDXS             访问Microsoft Index Server的OLE DB提供者
ADSDSOObject   访问Microsoft Active Directory Service的OLE DB提供者
Microsoft.Jet.OLEDB.3.51或4.0   访问Microsoft Jet(Access数据库)的OLE DB提供者
SQLOLEDB         访问Microsoft SQL Server数据库的OLE DB提供者
MSDAORA          访问Oracle的OLE DB提供者

使用Recordset对象

Recordset对象用于保存执行查询获得的记录,并可将修改后的记录返回服务器。
1.Recordset对象常用属性
*AbsolutePosition:返回当前记录在记录集中的序号
*ActiveConnection:设置或返回对象使用的活动连接
*Bof:记录指针指向第一条记录之前时返回值为True,否则为False
*CursorLocation:设置或返回指针(也称光标或游标)的位置,默认为adUseServer
*CursorType:设置或返回指针类型,默认为adOpenForward
*Eof(EndOfFile):记录指针指向最后一条记录之后时返回值为True,否则为False
*Filter:设置或返回记录集的数据过滤条件
*LockType:设置或返回记录加锁类型,默认为adLockReadOnly
*RecordCount:返回记录集中的记录数目
*State:返回记录集的当前状态
2.浏览记录集
在一个记录集中,只可能有一个记录成为当前记录,绝大多数记录集操作都是针对当前记录。Recordset对象提供了多个属性和方法来实现记录浏览,即切换当前记录。
Recordset对象与记录浏览相关的属性如下:
*PageSize:设置或返回记录集中每个记录页中包含的记录条数,默认值为10
*PageCount:返回记录页个数
*AbsolutePage:返回当前记录页序号
*AbsolutePosition:返回当前记录绝对位置的序号
*Bof:返回记录指针是否指向第一个记录之前
*Eof(EndOfFile):返回记录是否指向最后一个记录之后
*Bookmark:返回唯一标识当前记录的书签,或者将当前记录设置为书签标识的记录
Recordset对象与记录浏览相关的方法如下:
*Move n:使当前记录向前或向后的第n条记录成为当前记录,n大于0向前(记录集的末尾),n小于0向后(记录集的开头)。
*MoveFirst:使第一条记录成为当前记录
*MoveLast:使最后一条记录成为当前记录。
*MoveNext:使下(向记录集的末尾)一条记录成为当前记录
*MovePrevious:使上(向记录集的开头)一条记录成为当前记录
3.记录集排序
可利用记录集的Sort属性实现记录排序,排序仅仅是按排序的顺序访问记录,实际数据并没有排序。设置Sort属性时,需指定排序字段的名称,多个字段使 用逗号分隔。可用ASC或DESC关键字,前者表示按升序(从小到大)排序,后者表示按降序(从大到小)。默认为ASC。例 如:m_pRs->Sort="学号 ASC"
将Sort属性设置为空字符串可取消排序,恢复原始顺序。
4.筛选记录
可设置记录集的Filter属性来筛选记录,只有使筛选条件为True的记录才出现在记录集中。设置Filter属性会影响AbsolutePosition、AbsolutePage、RecordCount和PageCount属性值。
一般使用包含逻辑表达式的字符串作为Filter属性值,例如:
m_pRs->Filter="出生日期>#1990-1-1#"
字符串中的字符串用单引号括起来,日前用#括起来。字符串中可以使用>、<、<=、>=、<>、=或LIKE关系运 算符,AND和OR两个逻辑运算符,且AND和OR没有优先级之分。Like的模式字符串中可用*或%代表任意长度的任意字符构成的字符串,_代表一个任 意的字符。
将Filter属性设为空字符串或adFilterNone常量可取消筛选。
5.查找记录
记录集的Find方法用于查找记录,在条件字符串中可用>、<、=、或Like等关系运算构成关系表达式。条件字符串中的字符串用单引号括起来,日期使用#括起来。例如:
m_pRs->Find "出生日期=#1990-1-1#"
6.执行查询
首先执行Close方法关闭记录集,在命令文本中包含SQL Select查询,再执行Open方法重新打开记录集,从而获得指定的查询结果。例如:
m_pRs->Close();
m_strCmdText="SELECT * FROM StudentInfo WHERE age>=35";
m_pRs->Open((LPCTSTR)m_strCmdText,(LPCTSTR)m_strConnection,adOpenStatic,adLockOptimistic,adCmdTableDirect);
7.修改记录
在Visual C++中,记录集的Update方法用于修改记录。Update方法使用两个保存字段名称好字段值的安全数组作为参数。例如:
long index[1];
VARIANT flds,vals;   //声明两个安全数组变量
flds.vt=VT_ARRAY|VT_VARIANT;  //定义安全数组类型
vals.vt=VT_ARRAY|VT_VARIANT;
SAFEARRAYBOUND bound;   //声明安全数组边界变量
bound.cElements=5;   //定义安全数组元素个数
bound.lLbound=0;   //定义安全数组最小下标
COleVariant fld[5],val[5];  //用于保存字段名称和字段值
//设置字段名称数组元素值
fld[0]="id";
fld[1]="name";
fld[2]="age";
fld[3]="sex";
fld[4]="email";
//设置字段值数组元素值
val[0]=m_strDlgid;
val[1]=m_strDlgname;
val[2]=m_strDlgage;
val[3]=m_strDlgsex;
val[4]=m_strDlgemail;
//创建安全数组
flds.parray=::SafeArrayCreate(VT_VARIANT,1,&bound);
vals.parray=::SafeArrayCreate(VT_VARIANT,1,&bound);
for (int i=0;i<5;i++)
{
 index[0]=i;
 ::SafeArrayPutElement(flds.parray,index,&fld[i]);//将字段名称存入安全数组
 ::SafeArrayPutElement(vals.parray,index,&val[i]);//将字段值存入安全数组
}
m_pRs->Update(&flds,&vals);  //使用安全数组修改当前记录
8.添加记录
记录集的AddNew方法用于添加记录,添加记录与修改记录方法基本相同
long index[1];
VARIANT flds,vals;                       //声明两个安全数组变量
flds.vt=VT_ARRAY|VT_VARIANT;  //定义安全数组类型
vals.vt=VT_ARRAY|VT_VARIANT;
SAFEARRAYBOUND bound;          //声明安全数组边界变量
bound.cElements=5;                   //定义安全数组元素个数
bound.lLbound=0;                      //定义安全数组最小下标
COleVariant fld[5],val[5];             //用于保存字段名称和字段值
//设置字段名称数组元素值
fld[0]="id";
fld[1]="name";
fld[2]="age";
fld[3]="sex";
fld[4]="email";
//设置字段值数组元素值
val[0]=m_strDlgid;
val[1]=m_strDlgname;
val[2]=m_strDlgage;
val[3]=m_strDlgsex;
val[4]=m_strDlgemail;
//创建安全数组
flds.parray=::SafeArrayCreate(VT_VARIANT,1,&bound);
vals.parray=::SafeArrayCreate(VT_VARIANT,1,&bound);
for (int i=0;i<5;i++)
{
 index[0]=i;
 ::SafeArrayPutElement(flds.parray,index,&fld[i]);//将字段名称存入安全数组
 ::SafeArrayPutElement(vals.parray,index,&val[i]);//将字段值存入安全数组
}
m_pRs->AddNew(&flds,&vals);                        //使用安全数组修改当前记录
9.删除记录
记录集的Delete方法用于删除记录,例如:
m_pRs->Delete(adAffectCurrent);  //删除当前记录
m_pRs->MoveNext();                   //使下一条记录成为当前记录

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多