ADO数据绑定对话框向导可自动导入ADO对象库,并包含icrsint.h。在对象VisualC++中,CADORecordBinding类实现了如何在VisualC++中使用ADO对象。ADO数据绑定对话框向导建立了一个CADORecordBinding类的派生类CCustomRs。CCustomRs类定义了与制定数据库表字段对应的数据成员,并将数据成员绑定到字段。
在CCustomRs类头文件RsCgDlg.h的头部,导入了ADO库:
#import "C:/Program Files/CommonFiles/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 andSettings//Administrator//桌面
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
adLockBatchOptimistic
5.命令类型
命令类型用于决定提供者如何解释CommandText属性设置的命令文本,命令类型常量有:
AdCmdText
AdCmdTable
AdCmdTableDirect
AdCmdStoredProc
AdCmdUnknown
AdCommandFile
AdExecuteNoRecords
6.连接字符串
连接字符串用于指定数据提供者、数据库服务器、数据库、用户名好口令等连接信息。常用的数据提供者有:
MSDASQL
MSIDXS
ADSDSOObject
Microsoft.Jet.OLEDB.3.51或4.0
SQLOLEDB
MSDAORA
使用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方法关闭记录集,在命令文本中包含SQLSelect查询,再执行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.修改记录
在VisualC++中,记录集的Update方法用于修改记录。Update方法使用两个保存字段名称好字段值的安全数组作为参数。例如:
long index[1];
VARIANTflds,vals;
flds.vt=VT_ARRAY|VT_VARIANT;
vals.vt=VT_ARRAY|VT_VARIANT;
SAFEARRAYBOUNDbound;
bound.cElements=5;
bound.lLbound=0;
COleVariantfld[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++)
{
}
m_pRs->Update(&flds,&vals);
8.添加记录
记录集的AddNew方法用于添加记录,添加记录与修改记录方法基本相同
long index[1];
VARIANTflds,vals;
flds.vt=VT_ARRAY|VT_VARIANT;
vals.vt=VT_ARRAY|VT_VARIANT;
SAFEARRAYBOUNDbound;
bound.cElements=5;
bound.lLbound=0;
COleVariantfld[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++)
{
}
m_pRs->AddNew(&flds,&vals);
9.删除记录
记录集的Delete方法用于删除记录,例如:
m_pRs->Delete(adAffectCurrent);
m_pRs->MoveNext();
联系客服