📄 chap10_5.htm
字号:
<html>
<head>
<title>10.5 CRecordset类</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 3.0">
</head>
<body link="#3973DE" alink="#3973DE">
<font SIZE="5"><b><div align="center"><center>
<table border="0" width="615" cellspacing="0" cellpadding="0">
<tr>
</b><td><div align="center"><center><table border="0" width="615" cellpadding="0" cellspacing="0" height="20">
<tr>
<td width="377" bgcolor="#15397D" height="20"></td>
<td width="238" bgcolor="#000000" height="20"><p align="right"></font><span style="text-decoration: none"><a href="../../index.htm"><font color="#FFFFFF">电脑报Visual
C++网络教程</font></a></span></td>
</tr>
</table>
</center></div><font FACE="Times New Roman" SIZE="3"><b><p ALIGN="CENTER"></b></font><font FACE="Times New Roman" color="#3973DE" size="5">10.5 CRecordset</font><font color="#3973DE" size="5">类</font><font FACE="Times New Roman" size="5"></p>
</font><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">CRecordset</font><font SIZE="3">类代表一个记录集.该类是</font><font FACE="Times New Roman" SIZE="3">MFC</font><font SIZE="3">的</font><font FACE="Times New Roman" SIZE="3">ODBC</font><font SIZE="3">类中最重要、功能最强大的类。</font><b><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY"></font></b><font color="#3973DE" FACE="Times New Roman" SIZE="3">10.5.1
</font><font SIZE="3" color="#3973DE">动态集、快照、光标和光标库</font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY"></font><font SIZE="3">在多任务操作系统或网络环境中,多个用户可以共享同一个数据源。共享数据的一个主要问题是如何协调各个用户对数据源的修改。例如,当某一个应用改变了数据源中的记录时,别的连接至该数据源的应用应该如何处理。对于这个问题,基于</font><font FACE="Times New Roman" SIZE="3">MFC</font><font SIZE="3">的</font><font FACE="Times New Roman" SIZE="3">ODBC</font><font SIZE="3">应用程序可以采取几种不同的处理办法,这将由程序采用哪种记录集决定。</font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY"></font><font SIZE="3">记录集主要分为快照</font><font FACE="Times New Roman" SIZE="3">(Snapshot) </font><font SIZE="3">和动态集</font><font FACE="Times New Roman" SIZE="3">(Dynaset)</font><font SIZE="3">两种,</font><font FACE="Times New Roman" SIZE="3">CRecordset</font><font SIZE="3">类对这两者都支持。这两种记录集的不同表现在它们对别的应用改变数据源记录采取了不同的处理方法。</font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY"></font><font SIZE="3">快照型记录集提供了对数据的静态视.快照是个很形象的术语,就好象对数据源的某些记录照了一张照片一样.当别的用户改变了记录时(包括修改、添加和删除),快照中的记录不受影响,也就是说,快照不反映别的用户对数据源记录的改变.直到调用了</font><font FACE="Times New Roman" SIZE="3">CRecordset::Requery</font><font SIZE="3">重新查询后,快照才会反映变化.对于象产生报告或执行计算这样的不希望中途变动的工作,快照是很有用的。需要指出的是,快照的这种静态特性是相对于别的用户而言的,它会正确反映由本身用户对记录的修改和删除,但对于新添加的记录直到调用</font><font FACE="Times New Roman" SIZE="3">Requery</font><font SIZE="3">后才能反映到快照中.</font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY"></font><font SIZE="3">动态集提供了数据的动态视.当别的用户修改或删除了记录集中的记录时,会在动态集中反映出来:当滚动到修改过的记录时对其所作的修改会立即反映到动态集中,当记录被删除时,</font><font FACE="Times New Roman" SIZE="3">MFC</font><font SIZE="3">代码会跳过记录集中的删除部分.对于其它用户添加的记录,直到调用</font><font FACE="Times New Roman" SIZE="3">Requery</font><font SIZE="3">时,才会在动态集中反映出来。本身应用程序对记录的修改、添加和删除会反映在动态集中。当数据必须是动态的时侯,使用动态集是最适合的。例如,在一个火车票联网售票系统中,显然应该用动态集随时反映出共享数据的变化。</font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY"></font><font SIZE="3">在记录集中滚动,需要有一个标志来指明滚动后的位置(当前位置)。</font><font FACE="Times New Roman" SIZE="3">ODBC</font><font SIZE="3">驱动程序会维护一个光标,用来跟踪记录集的当前记录,可以把光标理解成跟踪记录集位置的一种机制。</font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY"></font><font SIZE="3">光标库</font><font FACE="Times New Roman" SIZE="3">(Cursor Library)</font><font SIZE="3">是处于</font><font FACE="Times New Roman" SIZE="3">ODBC</font><font SIZE="3">驱动程序管理器和驱动程序之间的动态链接库</font><font FACE="Times New Roman" SIZE="3">(ODBCCR32.DLL)</font><font SIZE="3">.光标库的主要功能是支持快照以及为底层驱动程序提供双向滚动能力,高层次的驱动程序不需要光标库,因为它们是可滚动的.光标库管理快照记录的缓冲区,该缓冲区反映本程序对记录的修改和删除,但不反映其它用户对记录的改变,由此可见,快照实际上相当于当前的光标库缓冲区.</font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY"></font><font SIZE="3">应注意的是,快照是一种静态光标</font><font FACE="Times New Roman" SIZE="3">(Static Cursor)</font><font SIZE="3">.静态光标直到滚动到某个记录才能取得该记录的数据.因此,要保证所有的记录都被快照,可以先滚动到记录集的末尾,然后再滚动到感兴趣的第一个记录上.这样做的缺点是滚动到末尾需要额外的开销,会降低性能.</font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY"></font><font SIZE="3">与快照不同,动态集不用光标库维持的缓冲区来存放记录.实际上,动态集是不使用光标库的,因为光标库会屏蔽掉一些支持动态集的底层驱动程序功能.动态集是一种键集驱动光标</font><font FACE="Times New Roman" SIZE="3">(Keyset-Driven Cursor)</font><font SIZE="3">,当打开一个动态集时,驱动程序保存记录集中每个记录的键.只要光标在动态集中滚动,驱动程序就会通过键来从数据源中检取当前记录,从而保证选取的记录与数据源同步.</font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY"></font><font SIZE="3">从上面的分析中可以看出,快照和动态集有一个共同的特点,那就是在建立记录集后,记录集中的成员就已经确定了.这就是为什么两种记录集都不能反映别的用户添加记录的原因.</font><font FACE="Times New Roman" SIZE="3"></p>
<b><p ALIGN="JUSTIFY"></b></font><font color="#3973DE" FACE="Times New Roman" SIZE="3">10.5.2
</font><font SIZE="3" color="#3973DE">域数据成员与数据交换</font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">CRecordset</font><font SIZE="3">类代表一个记录集.用户一般需要用</font><font FACE="Times New Roman" SIZE="3">ClassWizard</font><font SIZE="3">创建一个</font><font FACE="Times New Roman" SIZE="3">CRecordset</font><font SIZE="3">的派生类.</font><font FACE="Times New Roman" SIZE="3">ClassWizard</font><font SIZE="3">可以为派生的记录集类创建一批数据成员,这些数据成员与记录的各字段相对应,被称为字段数据成员或域数据成员.例如,对于表</font><font FACE="Times New Roman" SIZE="3">10.2</font><font SIZE="3">所示的将在后面例子中使用的数据库表,</font><font FACE="Times New Roman" SIZE="3">ClassWizard</font><font SIZE="3">会在派生类中加入</font><font FACE="Times New Roman" SIZE="3">6</font><font SIZE="3">个域数据成员,如清单</font><font FACE="Times New Roman" SIZE="3">10.1</font><font SIZE="3">所示.可以看出域数据成员与表中的字段名字类似,且类型匹配.</font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY"></font><b><font SIZE="3"> </p>
<p ALIGN="CENTER">表</font><font FACE="Times New Roman" SIZE="3">10.2 stdreg32.mdb</font><font SIZE="3">中的</font><font FACE="Times New Roman" SIZE="3">Section</font><font SIZE="3">表</font></b></p>
<table BORDER="1" CELLSPACING="1" CELLPADDING="1" WIDTH="577">
<tr>
<td WIDTH="17%"><font FACE="Times New Roman" SIZE="3"><b><p ALIGN="JUSTIFY">CourseID</p>
<p ALIGN="JUSTIFY">(Text)</b></font></td>
<td WIDTH="14%"><font FACE="Times New Roman" SIZE="3"><b><p ALIGN="JUSTIFY">SectionNo</p>
<p ALIGN="JUSTIFY">(Text)</b></font></td>
<td WIDTH="18%"><font FACE="Times New Roman" SIZE="3"><b><p ALIGN="JUSTIFY">InstructorID</p>
<p ALIGN="JUSTIFY">(Text)</b></font></td>
<td WIDTH="19%"><font FACE="Times New Roman" SIZE="3"><b><p ALIGN="JUSTIFY">RoomNo</p>
<p ALIGN="JUSTIFY">(Text)</b></font></td>
<td WIDTH="18%"><font FACE="Times New Roman" SIZE="3"><b><p ALIGN="JUSTIFY">Schedule</p>
<p ALIGN="JUSTIFY">(Text)</b></font></td>
<td WIDTH="14%"><font FACE="Times New Roman" SIZE="3"><b><p ALIGN="JUSTIFY">Capacity</p>
<p ALIGN="JUSTIFY">(int)</b></font></td>
</tr>
<tr>
<td WIDTH="17%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">MATH101</font></td>
<td WIDTH="14%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">1</font></td>
<td WIDTH="18%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">KLAUSENJ</font></td>
<td WIDTH="19%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">KEN-12</font></td>
<td WIDTH="18%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">MWF10-11</font></td>
<td WIDTH="14%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">40</font></td>
</tr>
<tr>
<td WIDTH="17%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">MATH101</font></td>
<td WIDTH="14%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">2</font></td>
<td WIDTH="18%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">ROGERSN</font></td>
<td WIDTH="19%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">WIL-1088</font></td>
<td WIDTH="18%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">TTH3:30-5</font></td>
<td WIDTH="14%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">15</font></td>
</tr>
<tr>
<td WIDTH="17%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">MATH201</font></td>
<td WIDTH="14%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">1</font></td>
<td WIDTH="18%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">ROGERSN</font></td>
<td WIDTH="19%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">WIL-1034</font></td>
<td WIDTH="18%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">MWF2-3</font></td>
<td WIDTH="14%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">20</font></td>
</tr>
<tr>
<td WIDTH="17%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">MATH201</font></td>
<td WIDTH="14%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">2</font></td>
<td WIDTH="18%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">SMITHJ</font></td>
<td WIDTH="19%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">WIL-1054</font></td>
<td WIDTH="18%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">MWF3-4</font></td>
<td WIDTH="14%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">25</font></td>
</tr>
<tr>
<td WIDTH="17%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">MATH202</font></td>
<td WIDTH="14%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">1</font></td>
<td WIDTH="18%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">KLA</font></td>
<td WIDTH="19%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">WIL-1054</font></td>
<td WIDTH="18%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">MWF9-10</font></td>
<td WIDTH="14%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">20</font></td>
</tr>
<tr>
<td WIDTH="17%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">MATH202</font></td>
<td WIDTH="14%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">2</font></td>
<td WIDTH="18%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">ROGERSN</font></td>
<td WIDTH="19%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">KEN-12</font></td>
<td WIDTH="18%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">TTH9:30-11</font></td>
<td WIDTH="14%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">15</font></td>
</tr>
<tr>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -