当前位置:松语文学 > 其他类型 >VC++_6.0程序设计从入门到精通最新章节 > VC++_6.0程序设计从入门到精通TXT下载
错误举报

第 71 章

  记录中向前滚动外,与静态游标相同

  .adOpenKeyset

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

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

  adOpenDynamic

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

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

  adOpenStatic

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

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

  表12-22 锁定类型LockType

  取值 意义

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

  AdLockPessimistic

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

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

  AdLockOptimistic

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

  定记录

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

  表12-23 cāo作类型Options

  取值 意义

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

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

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

  adCmdStoredProc 指示strSQL 为存储过程

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

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

  adAsyncExecute 指示应异步执行strSQL

  adAsyncFetch

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

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

  adAsyncFetchNonBlocking

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

  移到文件末尾

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

  _Recordset m_recordSet;

  //创建实例

  m_recordSet.CreateInstance(__uuidof(Recordset));

  枫叶文学网www.fywxw.com

  Visual C++ 6.0 程序设计从入门到精通

  ·354·

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

  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 对记录的cāo作

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

  1.添加记录

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

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

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

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

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

  已经赋值的变量)

  m_Recordset->AddNew();

  m_Recordset->PutCollect("ID", m_ID);

  m_Recordset->PutCollect("Ncom", _variant_t(m_Ncom));

  m_Recordset->PutCollect("Telephone", m_Telephone);

  m_Recordset->PutCollect("Address", _variant_t(m_Address));

  m_Recordset->Update();

  2.修改记录

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

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

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

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

  m_Recordset->PutCollect("ID", m_NewID);

  枫叶文学网www.fywxw.com

  第12 章 数据库开发

  ·355·

  m_Recordset->PutCollect("Ncom", _variant_t(m_NewNcom));

  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 关闭记录集

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

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

  //关闭记录集

  if (m_recordSet != NULL)

  m_recordSet->Close();

  //关闭连接

  if (m_connection !=NULL)

  m_connection->Close();

  12.7 利用ADO 查询并cāo作数据库实例

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

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

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

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

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

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

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

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

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

  结果集rs 中读取数据,然后放到List Box 控件m_List 中。如果采用新的类型,具体代码如

  下:

  枫叶文学网www.fywxw.com

  Visual C++ 6.0 程序设计从入门到精通

  ·356·

  _variant_t Holder;

  Holder = rs->GetCollect("FIELD_1");

  m_List.AddString((char*)_bstr_t(Holder));

  对比一下没有采用_variant_t 和 _bstr_t 的代码:

  COleVariant covFieldValuel;

  VARIANT vFieldValue;

  CString Holder;

  Rs->GetFieldValue("FIELD_1", covFieldValue);

  vFieldValue = (LPVARIANT)covFieldValue;

  Holder.Format("%s",vFieldValue->pbVal);

  m_List.AddString(Holder);

  另外在编写程序时要用try 和catch,否则ADO 调用错误有可能使程序崩溃,一定要随

  时记得捕捉_com_error 例外以及其他错误。

  此外,在第2 节介绍如何设置ODBC 数据源时提到了利用COM 组件DataSourceLocator,

  用户可以在程序运行的过程中动态设置数据源。至于如何利用此组件,将在程序中详细说明。

  下面具体介绍该程序的编写过程。

  1.创建工程

  新建一个MFC 工程,取名为AdoTest,在第一步中选择单文档,在最后一步的基类选择

  CFormView,分别如图12-20 和图12-21 所示。

  图12-20 单文档工程 图12-21 基类选择CFormView 类

  2.链入ADO 库文件

  在文件“stdafx.h”中加入如下语句:

  #import "C:\Program Files\Common Files\system\ole db\oledb32.dll" no_ncomspace

  #import "c:\program files\common files\system\ado\msado15.dll" no_ncomspace rencom("EOF", "adoEOF")

  加入第二个语句前面已经讲过原因,加入第一个语句是由于在程序中将要采用COM 组

  件DataSourceLocator。这里需要注意一点,两个import 语句中都用了no_ncomspace,当引入

  枫叶文学网www.fywxw.com

  第12 章 数据库开发

  ·357·

  多个库时,可能会引起名字的冲突。不过由于本程序较小,且只有两个库,所以在这里用

  no_ncomspace 也可以。

  3.界面设计

  在显示数据库内容时,可以利用ActiveX 控件DataGrid Control,将会大大简化编码的工

  作。至于如何做,下面的程序中进行介绍。通过单击“Project”“Add To Project”“Components

  and Controls”,弹出如图12-22 所示的对话框,在此对话框中打开“Registered ActiveX Controls”

  文件夹,然后选中“Microsoft DataGrid Control, Version 6.0(OLEDB)”,如图12-23 所示。单

  击“Insert”按钮,在弹出的确认对话框中单击“确定”按钮,然后在弹出的“Confirm Classes”

  对话框中取默认值,如图12-24 所示,单击“OK”按钮返回“Components and Controls Gallery”

  对话框,单击“Close”按钮即可将DataGrid Control 加入到工程中。

  图12-22 添加组件及控件对话框

  图12-23 添加DataGrid 控件对话框

  接下来进行界面设计, 在资源视图中找到对话框文件夹, 然后在ID 为

  IDD_ADOTEST_FORM 的对话框中添加一些控件,如图12-25 所示。其中,最左边是一个

  List Box 控件,用来显示数据库中的表项;中间就是上面所加入的DataGrid ActiveX 控件(在

  控件栏的最下端可以看到一个红色的标志,这就是DataGrid Control);最右边的5 个按钮

  枫叶文学网www.fywxw.com

  Visual C++ 6.0 程序设计从入门到精通

  ·358·

  Button1~Button5 分别对应设定数据源、连接数据库、执行SQL 语句、断开连接和退出;对

  话框下面的“连接串”和“cāo作”都是Static Text 控件;两个Edit Box 控件分别用来显示连

  接语句和输入SQL 语句。

  图12-24 类确认对话框

  图12-25 添加控件后的对话框

  然后对各控件的属xìng进行设置,具体设置如表12-24 所示。

  表12-24 控件属xìng设置表

  控件 ID Caption

  Datagrid 控件 IDC_DATAGRID DataGrid1

  List Box 控件 IDC_LIST

  松语文学免费小说阅读_www.16sy.com