ADO智能指针使用详解一、ADO接口——Connection对象(连接对象)——对应智能指针为_ConnectionPtr在使用ADO进行操作之前,必须使用AfxOleInit()函数来进行初始化。
使用BeginTrans、CommitTrans和RollbackTrans方法可以启动、提交和回滚一个处理事务。
通过操作the Errors 集合可以获取和处理错误信息,操作CommandTimeout属性可以设置连接的溢出时间,操作ConnectionString属性可以设置连接的字符串,操作Mode属性可以设置连接的模式,操作Provider属性可以指定OLE DB提供者。
(1)Open()方法:用于打开一个库连接_ConnectionPtr智能指针的用法:①首先定义一个Connection类型的指针,然后调用CreateInstance()来创建一个连接对象的实例,再调用Open()函数建立与数据源的连接。
②在建立连接对象后,可以使用连接对象的Execute()函数来执行SQL命令。
_ConnectionPtr智能指针Open()方法的原型:Open(_bstr_t ConnectionString,_bstr_t UserID,_bstr_t Password,long Options)①ConnectionString为连接字串,UserID是用户名,Password是登陆密码②Options是连接选项,可以是如下几个常量:1> adModeUnknown 缺省,当前的许可权未设置2> adModeRead 只读3> adModeWrite 只写4> adModeReadWrite 可以读写5> adModeShareDenyRead 阻止其它Connection对象以读权限打开连接6> adModeShareDenyWrite 阻止其它Connection对象以写权限打开连接7> adModeShareExclusive 阻止其它Connection对象打开连接8> adModeShareDenyNone 阻止其它程序或对象以任何权限建立连接(2)Execute()方法:用于执行SQL语句函数原型:_RecordsetPtr Connection::Execute(_bstr_t CommandText,VARIANT* RecordsAffected,long Options)参数:①CommandText是命令字串,通常是SQL命令,②RecordsAffected是操作完成后所影响的行数③Options表示CommandText中内容的类型,可以取下列值之一:1> adCmdText 表明CommandText是文本命令2>adCmdTable 表明CommandText是一个表名3>adCmdProc 表明CommandText是一个存储过程4>adCmdUnknown 未知Execute执行完后返回一个指向记录集的指针(_ResultsetPtr类型)(3)异常捕获:出现的异常为_com_errorError对象包含了ADO数据操作时发生错误的详细描述,ADO的任何对象都可以产生一个或者多个数据提供者错误,当错误发生时,这些错误对象被添加到Connection 对象的Errors集合里。
当另外一个ADO对象产生一个错误时,Errors集合里的Error对象被清除,新的Error对象将被添加到Errors集合里。
借助于Errosr对象的集合、方法和属性,可以通过读取Number和Description属性,获得ADO错误号码和对错误的描述,通过读取Source属性得知错误发生的源。
二、ADO接口——Recordset对象(记录集对象)——对应智能指针为_RecordsetPtr_RecordsetPtr智能指针,它是专门为通过记录集操作数据库而设立的指针,通过该接口可以对数据库的表内的记录、字段等进行各种操作。
记录集相当于是实际数据的一份拷贝。
A.创建记录集对象_ConnectionPtr m_pRecordset;m_pRecordset.CreateInstance(__uuidof(Recorset));创建记录集对象,只是为它分配内存空间,记录集中不含任何数据。
B.打开记录集记录集对象是用来获得数据库中的数据并对其操作的,所以还要打开记录集,从数据库中取得数据记录。
可有多种方法打开记录集,如使用_CommondPt::.Execute()来返回一个记录集,或是用_Recordset::Open()方法来打开一个记录集。
(1)Open()方法函数原型:HRESULT Recordset::Open(const _variant_t&Source,const_variant_t&ActiveConnection,enum CursorTypeEnum CursorType,enum LockTypeEnum LockType,long Options)For Example:假设m_pConnection是已经建立好的连接,我们使用_RecordsetPtr 接口的Open方法打开Employees表的记录集的语句如下:m_pRecordset->Open("SELECT * FROM Employees", _variant_t((IDispatch*)m_pConne ction,true), adOpenStatic, adLockOptimistic, adCmdText);参数:Source是数据查询字符串,可以是一个SQL语句、一个表的名字或一个命令对象等等;ActiveConnection是已经建立好的连接(我们需要用Connection对象指针来构造一个_variant_t对象);CursorType光标类型,它是枚举CursorTypeEnum中的一个值,可取如下值之一:adOpenUnspecified=-1 不作特别指定adOpenForwardOnly=0 默认值,前滚静态光标。
(这种光标只能向前浏览记录集,比如用MoveNext向前滚动,这种方式可节省资源,提高浏览速度,但诸如BookMark、RecordCount、AbsolutePosition、AbsolutePage都不能使用。
)adOpenKeyset=1 键集游标,采用这种光标的记录集看不到其它用户的新增、删除操作,但对于更新原有记录的操作对你是可见的。
adOpenDynamic=2 动态光标,所有数据库的操作都会立即在用户记录集上反应出来。
adOpenStatic=3 静态游标。
它为记录产生一个静态备份,其他用户的新增、删除、更新操作对你的记录集来说是不可见的。
LockType锁定类型,它是枚举LockTypeEnum中的一值,可以是以下值之一 enum LockTypeEnum{adLockUnspecified=-1, //未指定adLockReadOnly=1,//只读记录集,默认值。
无法更改数据。
adLockPessimistic=2,//悲观锁定方式。
只有在调用Update方法时才锁定记录。
这是最安全的锁定机制adLockOptimistc=3,//乐观锁定方式,只有在你调用Update方法时才锁定记录。
adLockBatchOptimistic=4//乐观分批更新。
编辑时记录不会锁定,更改、插入及删除是在批处理模式下完成。
}Options指定Source的类型,可以取如下值之一:adCmdText: 表明CommandText是文本命令。
adCmdTable: 表明CommandText是一个表名。
adCmdProc: 表明CommandText是一个存储过程。
adCmdUnknown: 未知。
C.指针的移动移动记录指针可以通过MoveFirst()方法移动到第一条记录,MoveLast()方法移动到最后一条记录,MovePrevious()方法移动到当前记录的前一条记录,MoveNext()方法移动到当前记录的下一条记录。
也可以使用Move(记录号)移动记录指针到需要位置。
注意:Move()方法是相对于当前记录来移动指针位置的。
正值向后移动,负值向前移动。
如Move(3),当前记录是3时,它将从记录3开始往后再移动3条记录位置。
两个_RecordsetPtr属性:BOF 属性表示记录集第一条记录之前的游标,用来判断记录集是否为空EOF(通常会rename为adoEOF)属性表示记录集最后一条记录之后的游标,用来判断是否结束D.数据的读取GetCollect(字段名)来获取当前记录指针所指的字段值返回值的类型为:_variant_tE.数据的更新:用PutCollect(字段名,值)将新值写入,并Update()更新到数据库。
F.插入记录先移动记录指针到要插入的位置,用AddNew()插入一条记录,然后用PutCollect(字段名,值)写入值,最后用Update()更新到数据库;G.删除记录删除单条记录:先移动记录指针到合适的位置,然后用Delete()方法删除它(取参数adAffectCurrent,表示操作只影响当前的记录),并用Update()来更新数据库;H.关闭记录集直接用Close()方法关闭记录集并赋予其空值。
代码如下:m_pRecordset->Close();m_pRecordset=NULL;类似于_ConnectionPtr的关闭方法;(2). 取得一个字段的值的两种办法A、表示取得第0个字段的值m_pRecordset->GetCollect(“Name”);B、或者m_pRecordset->GetCollect(_variant_t(long(0));三、ADO接口——Command对象(记录集对象)——对应智能指针为_CommandPtrCommand对象是一个对数据源执行命令的定义,使用该对象可以查询数据库并返回一个Recordset对象,可以执行一个批量的数据操作,可以操作数据库的结构。
不同的数据提供者提供的该对象的集合、方法和属性不同。
借助于Command对象的集合、方法和属性,可以使用Parameters集合制定命令的参数,可以使用Execute方法执行一个查询并将查询结果返回到一个Recordset对象里,操作CommandText属性可以为该对象指定一个命令的文本,操作CommandType属性可以指定命令的类型,操作Prepared可以得知数据提供者是否准备好命令的执行,操作CommandTimeout属性可以设置命令执行的溢出时间。