程序中常用操作
_variant_t vUsername,vID,vname; //变量声明
_RecordsetPtr m_pRecordset; //记录集
CString strid;
_ConnectionPtr connection;
m_pRecordset.CreateInstance(__uuidof( Recordset )); //创建实例
m_pRecordset->Open("SELECT * FROM users",connection.GetInterfacePtr(),adOpenStatic,adLockOptimistic,adCmdText);//执行SQL语句,得到记录集, connection必须已和数据库连接
while(!m_pRecordset->adoEOF)///这里为什么是adoEOF而不是EOF呢?还记得rename("EOF","adoEOF")这一句吗?
{
vID = m_pRecordset->GetFields()->GetItem((long)0).Value;///取得第1列的值,从0开始计数,
strid = (TCHAR*)(_bstr_t)vID //转换为字符串
vname = m_pRecordset->GetFields()->GetItem( (long)0).name;//取得第一列属性名
vUsername = m_pRecordset->GetCollect("username");///直接给出列的名称,如本行,取得username字段的值
m_pRecordset->MoveNext();///移到下一条记录
}
m_pRecordset->GetFields()->Count//获得一条记录的字段数
m_pRecordset->MoveFirst();///移到首条记录
m_pRecordset->Delete(adAffectCurrent);///删除当前记录
///添加三条新记录并赋值
for(int i=0;i<3;i++)
{
m_pRecordset->AddNew();///添加新记录
m_pRecordset->PutCollect("ID",_variant_t((long)(i+10)));
m_pRecordset->PutCollect("username",_variant_t("haiyan"));
m_pRecordset->PutCollect("old",_variant_t((long)71));
m_pRecordset->PutCollect("birthday",_variant_t("1930-3-15"));
}
m_pRecordset->Move(1,_variant_t((long)adBookmarkFirst));///从第一条记录往下移动一条记录,即移
动到第二条记录处
m_pRecordset->PutCollect(_variant_t("old"),_variant_t((long)45));///修改其年龄
m_pRecordset->Update();///保存到库中
Open方法的原型是这样的:
HRESULT Recordset15::Open ( const _variant_t & Source, const _variant_t & ActiveConnection,enum CursorTypeEnum CursorType, enum LockTypeEnum LockType, long Options )
①Source是数据查询字符串
②ActiveConnection是已经建立好的连接(我们需要用Connection对象指针来构造一个_variant_t对象)
③CursorType光标类型,它可以是以下值之一,请看这个枚举结构:
enum CursorTypeEnum
{
adOpenUnspecified = -1,///不作特别指定
adOpenForwardOnly = 0,///前滚静态光标。这种光标只能向前浏览记录集,比如用MoveNext向前滚动,这种方式可以提高浏览速度。但诸如BookMark,RecordCount,AbsolutePosition,AbsolutePage都不能使用
adOpenKeyset = 1,///采用这种光标的记录集看不到其它用户的新增、删除操作,但对于更新原有记录的操作对你是可见的。
adOpenDynamic = 2,///动态光标。所有数据库的操作都会立即在各用户记录集上反应出来。
adOpenStatic = 3///静态光标。它为你的记录集产生一个静态备份,但其它用户的新增、删除、更新操作对你的记录集来说是不可见的。
};
④LockType锁定类型,它可以是以下值之一,请看如下枚举结构:
enum LockTypeEnum
{
adLockUnspecified = -1,///未指定
adLockReadOnly = 1,///只读记录集
adLockPessimistic = 2,悲观锁定方式。数据在更新时锁定其它所有动作,这是最安全的锁定机制
adLockOptimistic = 3,乐观锁定方式。只有在你调用Update方法时才锁定记录。在此之前仍然可以做数据的更新、插入、删除等动作
adLockBatchOptimistic = 4,乐观分批更新。编辑时记录不会锁定,更改、插入及删除是在批处理模式下完成。
};
5.option可以取以下值
adCmdText:表明CommandText是文本命令
adCmdTable:表明CommandText是一个表名
adCmdProc:表明CommandText是一个存储过程
adCmdUnknown:未知
Recordset 对象的常用属性
Recordset 对象的常用属性<表> 属 性 描 述 / 注 解 ActiveConnection 指定与数据提供者的连接信息,用来指定当前的 Recordset 对象属于哪个 Connection 对象。
Source 指定 Recordset 对象的数据源,可以是一个 Command 对象名、SQL 语句、数据库表或存储过程 。
CoursorType 指定 Recordset 对象所使用的光标类型。 共有 4 种光标类型:
0 一 前滚光标,光标只能向前移动,执行效率高。是 Cursor 的默认值;
1 一 键盘光标,光标可向前或向后移动,Recordset 记录集同步反映自它创建后其他用户所作的修改和删除,但却不能同步反映自它创建后其他用户新增加的记录;
2 一 动态光标,光标可向前或向后滚动,任何时候 Recordset 记录集都同步反映其他用户的任何操作;
3 一 静态光标,光标可向前或向后移动,自创建后无法同步反映其他用户所做的任何操作,它的功能简单但消耗资源少。
LockType 表示编辑时记录的锁定类型。它决定了当不止一个用户试图同时改变一个记录时,Recordset 如何处理数据记录。
0 一 只读锁定,记录只读,不能更新 Recordset ,为 LockType 的默认值;
1 一 悲观锁定,编辑记录开始立刻锁定,直到提交给数据提供者;
2 一 乐观锁定,一次锁定一条记录,只有调用 Update 方法提交数据时才锁定记录;
3 一 乐观的批量更新,允许同时更新多条记录。
Filter 用来设定一个过滤条件,以便对 Recordset 记录进行过滤。
CacheSize 表示一个 Recordset 对象在高速缓存中的记录数。
Maxrecords 执行一个 SQL 查询时,返回 Recordset 对象的最大记录数。
Bof 判断记录指针是否到了第一条记录之前。 Eof 判断记录指针是否到了最后一条记录之后。
RecordCount 返回 Recordset 对象的记录数,(在使用键盘光标时,该属怀返回 的可能是不太准确的数值;一般情况下,并不用这种方法来统计 Recordset 中的记录数,因为它的性能并不稳定)
Bookmark 书签标记,用来保存当前记录的位置。
AbsolutePosition 用来设定 Recordset 对象中当前记录的顺序位置是第几行记录。
PageSize 表示 Reccordset 对象的页面大小(每页多少条记录),默认值为10。 PageCount 表示 Recordset 对象的页面个数。 AbsolutePage 表示当前记录的页号。
EditMode 指示当前记录的编辑状态,0 一 已被编辑;1 一 已被修改而未提交;2 一 存入数据库的新记录 。 Status 对 Recordset 对象进行批量更新后,查询当前记录的状态。
值意义描述 0 记录更新成功。 1024 存在记录锁定,新记录未保存。 1 新记录。 2048 使用乐观并发事件,未保存。 2 记录被删除。 4096 用户违反完整性规则,记录未保存。 4 记录未被删除。 8192 很待定修改,记录未保存。 8 记录未被修改。 16384 与一存储对象相冲突,记录未保存。 16 书签不合法,记录未保存。 32768 内存不够,记录未保存。 64 影响多个记录,未保存。 65536 用户没有中、足够的权限,未保存。 128 指向一待定插入,记录未保存。 131072 违反基本数据库原则,记录未保存。 256 操作被取消,记录未保存。 262144 记录已从数据源删除。
可以创建所需数量的 Recordset 对象。
打开 Recordset 时,当前记录位于第一个记录(如果有),并且 BOF 和 EOF 属性被设置为 False。如果没有记录,BOF 和 EOF 属性设置是 True。
假设提供者支持相关的功能,可以使用 MoveFirst、MoveLast、MoveNext 和 MovePrevious 方法以及 Move 方法,和 AbsolutePosition、AbsolutePage 和 Filter 属性来重新确定当前记录的位置。仅向前 Recordset 对象只支持 MoveNext 方法。当使用 Move 方法访问每个记录(或枚举 Recordset)时,可使用 BOF 和 EOF 属性查看是否移动已经超过了 Recordset 的开始或结尾。