友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
一世书城 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

VC语言6.0程序设计从入门到精通-第98章

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!






    m_Connection…》Execute(“select * from Contact”; &RecordsAffected; adCmdText);  



    2 .利用 mand 对象执行 SQL 命令  



     当要执行复杂的命令以及执行带参数的命令时,要使用命令对象对数据源进行操作。一 

般的,利用 mand 对象打开记录集代码如下:  



    _mandPtr m_mand;  



    //创建实例  



    m_mand。CreateInstance(〃ADODB。mand〃);  



    //指向当前连接  



    m_mand…》ActiveConnection = m_Connection;  



    //设置命令字串  



    m_mand…》mandText = 〃select *from Contact〃;  



    //执行命令,打开记录集  



    m_Recordset = m_mand…》Execute(&vNULL; &vNULL; adCmdText);  



 ·352 ·  


…………………………………………………………Page 364……………………………………………………………

                                                                   第 12 章    数据库开发  



    3 .直接利用 Recordset 对象打开记录集  



    利用 Recordset 的 Open()方法,可以方便的打开一个记录集。Open()方法的原型如下:  



    Open(VARIANT  Source;  VARIANT  ActiveConnection ;  CursorTypeEnum  CursorType;LockTypeEnum  



LockType ; LONG Options)。  



    各参数意义如下:  

    o  Source:通常是对数据库进行操作的 SQL 语句,但具体还要看第 5 个参数的取值;  

    o  ActiveConnection :表示当前的数据连接。  

    o  CursorType :记录集光标类型,它的取值如表 12…21 所示。  

    o  LockType :用于指示在什么时候锁定记录,取值如表 12…22 所示。  

    o  Options :操作类型,取值如表 12…23 所示。  



    表 12…21                       光标类型 CursorType  



         取值                                        意义  

 adOpenForwardOnly     指向前游标,默认值。除了只能在记录中向前滚动外,与静态游标相同  

                       键集游标。用户自己的记录集不能访问其他用户删除的记录,无法查看其他 

 。adOpenKeyset  

                       用户添加的记录,但仍然可以看见其他用户更改的数据  

                       动态游标。可以看见其他用户所作的添加、更改和删除。允许在记录集中进 

 adOpenDynamic  

                       行所有类型的移动,但不包括提供者不支持的书签操作  

                       静态游标。可以用来查找数据或生成报告的记录集合的静态副本。另外,对 

 adOpenStatic  

                       其他用户所作的添加、更改或删除不可见  



    表 12…22                        锁定类型 LockType  



         取值                                        意义  

 AdLockReadOnly        (默认值)只读,不能改变数据  

                       保守式锁定(逐个),提供者完成确保成功编辑记录所需的工作,通常通过在 

 AdLockPessimistic  

                       编辑时立即锁定数据源的记录  

                       开放式锁定(逐个),提供者使用开放式锁定,只在调用 Update()方法时才锁 

 AdLockOptimistic  

                       定记录  

 AdLockBatchOptimistic  开放式批更新。用于批更新模式(与立即更新模式相对)  



    表 12…23                         操作类型 Options  



          取值                                        意义  

 adCmdText              指示 strSQL 为命令文本,即普通的 SQL 语句  

 adCmdTable             指示 ADO 生成 SQL 查询以便在 strSQL 命名的表中返回所有行  

 adCmdTableDirect       指示所作的更改在 strSQL 中命名的表中返回所有行  

 adCmdStoredProc        指示 strSQL 为存储过程  

 adCmdUnknown           指示 strSQL 参数中的命令类型为未知  

 adCmdFile              指示应在 strSQL 命名的文件中恢复保留(保存的)Recordset  

 adAsyncExecute         指示应异步执行 strSQL  

                        指示在提取  Initial  Fetch  Size  属性中指定的初始数量后,应该异步提取所有 

 adAsyncFetch  

                       剩余的行。如果所需的行尚未提取,主要的线程将被堵塞直到行重新可用  

                        指示主要线程在提取期间从未堵塞。如果所请求的行尚未提取,当前行自动 

 adAsyncFetchNonBlocking  

                       移到文件末尾  



    下面是一段利用 Recordset 的 Open()方法打开记录集的代码:  



    _Recordset m_recordSet;  



    //创建实例  



    m_recordSet。CreateInstance(__uuidof(Recordset));  



                                                                               ·353 ·  


…………………………………………………………Page 365……………………………………………………………

Visual C++ 6。0 程序设计从入门到精通  



     //根据连接字符串开启数据连接,得到结果集  



     m_recordSet…》Open(〃select  *  from  Contact〃;  m_connection。GetInterfacePtr();  adOpenDynamic;  



adLockOptimistic; adCmdText);  



     注意:当比较频繁的访问数据库的时候,最好先用全局_ConnectionPtr                       接口创建一个数据连接, 



           然后用_ResultsetPtr 接口来处理数据。本章第 6 节的例子便是采用的这种方法。  



     获得记录集后,可以利用 MoveNext() 函数方便的实现记录集的遍历,代码如下:  



     while(!m_Recordset…》adoEOF)  



     {  



          …  



         //获得下一条记录  



         m_Recordset…》MoveNext();  



     }  



     当然,利用 12。5 节介绍的其他方法也可以较为方便地实现记录集的遍历,读者可以自己 

编码实验。  



12。6。4    对记录的操作  



     对记录的操作主要有添加、修改和删除 3 种。  



     1.添加记录  



     打开记录集后,就可以往里面添加记录了,添加一条记录一般按如下步骤进行。  

     o  调用 Recordset 对象的 AddNew()方法新增一个空记录。  

     o  调用 Recordset 对象的 PutCollect()方法输入每个字段的值。  

     o  调用 Recordset 对象的 Update()方法更新数据库中的数据。  

     下面是添加记录的一段代码:(假设 m_ID 、m_Name 、m_Telephone  和 m_Address  均为 

                    

已经赋值的变量) 



     m_Recordset…》AddNew();  



     m_Recordset…》PutCollect(〃ID〃; m_ID);  



     m_Recordset…》PutCollect(〃Name〃; _variant_t(m_Name));  



     m_Recordset…》PutCollect(〃Telephone〃; m_Telephone);  



     m_Recordset…》PutCollect(〃Address〃; _variant_t(m_Address));  



     m_Recordset…》Update();  



     2 .修改记录  



     修改一条记录通常按如下步骤进行。  

     o  调用 Recordset 对象的 PutCollect()方法给当前记录的每个字段赋值。  

     o  调用 Recordset 对象的 Update()方法更新数据库中的数据。  

     以下是修改当前记录的代码:  



     m_Recordset…》PutCollect(〃ID〃; m_NewID);  



 ·354 ·  


…………………………………………………………Page 366……………………………………………………………

                                                                    第 12 章    数据库开发  



    m_Recordset…》PutCollect(〃Name〃; _variant_t(m_NewName));  



    m_Recordset…》PutCollect(〃Telephone〃; m_NewTelephone);  



    m_Recordset…》PutCollect(〃Address〃; _variant_t(m_NewAddress));  



    m_Recordset…》Update();  



    3 .删除记录  



    利用 Recordset 对象的 Delete()方法很容易删除记录。Delete()方法的原型如下:  



    Delete(enum AffectedEnum AffectRecords);  



    参数    AffectRecords 是一个枚举型变量,用于指定删除方式。如果为此变量赋值 

adAffectCurrent,则只有当前记录被删除;如果赋值为  adAffectedGroup,则符合过滤器的所 

有行都被删除。下面一段代码将当前记录删除:  



    m_Recordset…》Delete(asAffectCurrent);  



    m_Recordset…》Update();  



12。6。5    关闭记录集  



    当所有操作结束后,应当关闭记录集及当前连接,分别调用 Recordset 对象和 Connection 

对象的 Close()方法即可,代码如下:  



    //关闭记录集  



    if (m_recordSet != NULL)  



         m_recordSet…》Close();  



    //关闭连接  



    if (m_connection !=NULL)  



         m_connection…》Close();  



12。7    利用 ADO 查询并操作数据库实例  



    实例 12…2:ADO 使用实例。源代码在光盘中“12实例 12…2AdoTest”目录下。  



    前面讲了很多 ADO 的基础知识,读者也应该对 ADO 有了一个基本的了解,并且知道了 

ADO 的常用函数和操作数据库的步骤。下面即将进行实际操作,这里将利用上面所讲的知识 

编写一个程序,达到查询和操作数据库的目的。  

    在具体编写程序前,还要了解一下经常用到的两种类型,即_variant_t 和_bstr_t 。它们是 

两个类,分别继承了 VARIANT 和 BSTR ,并增加了一些方法。之所以引入这两种数据类型, 

是因为  必须设计成跨平台,在  里用不了 CString 类,这时需要有一种更普遍的方 

式来处理字符串以及其他数据。VARIANT 就是一个巨大的 union ,包含了除 char  * 以外的所 

有的数据类型,BSTR 取代了 char* 。利用新引入的这两种类型,会使编程更加方便。比如从 

结果集 rs  中读取数据,然后放到 Li
返回目录 上一页 下一页 回到顶部 0 1
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!