登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

图像处理 视频分析 机器视觉 模式识别

方向比努力更重要

 
 
 

日志

 
 
关于我

河北软件开发项目,电子警察卡口项目,公安天网项目,媒体流处理,数字图像处理。媒体服务器 RTSP、图像处理、车牌识别……DCT变换,H.264压缩

_RecordsetPtr的用法  

2011-05-30 10:23:21|  分类: ____数据库 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

参考文章:http://search.e800.com.cn/search 然后搜索 Visual C++ ADO数据库编程入门
代码参考:http://www.cppprog.com/2009/0108/46.html

_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必须已和数
据库连接
/*************原型*****************/
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:未知

/******************************************************/

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();///保存到库中

在这说明一下:

在我的一个.NET数据库连接程序中,出现一个问题,每次初始化打开数据集时程序报错说"数据库打开错误,无效指针",让我郁闷好几个小时,后来发现,当我在创建数据库连接对象前加入函数CoInitialize(NULL)后,错误解决,源码如下:

CoInitialize(NULL);
hr=m_pConnection.CreateInstance(_uuidof(Connection));

MSDC 说明如下:

You need to initialize the COM library on an apartment before you call any of the

library functions except CoGetMalloc,to get a pointer to the standard allocator,

and the memory allocation functions



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 的开始或结尾。
 

  评论这张
 
阅读(958)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018