您的位置:首页 > 编程语言 > PHP开发

ADO中_RecordsetPtr的使用

2014-04-26 17:58 387 查看
程序中常用操作

_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 的开始或结尾。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: