📄 chap10_5.htm
字号:
</tr>
<tr>
<td WIDTH="39%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">CRecordset::dynamic</font></td>
<td WIDTH="61%"><font SIZE="3"><p ALIGN="JUSTIFY">提供比动态集更好的动态特性,大部分</font><font FACE="Times New Roman" SIZE="3">ODBC</font><font SIZE="3">驱动程序不支持这种记录集.</font></td>
</tr>
<tr>
<td WIDTH="39%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">CRecordset::forwardOnly</font></td>
<td WIDTH="61%"><font SIZE="3"><p ALIGN="JUSTIFY">只能前向滚动的只读记录集.</font></td>
</tr>
</table>
<p><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>
<p ALIGN="CENTER"></font><b><font SIZE="3">表</font><font FACE="Times New Roman" SIZE="3">10.4
</font><font SIZE="3">创建记录集时的常用选项</font></b></p>
<table BORDER="1" CELLSPACING="1" CELLPADDING="1" WIDTH="579">
<tr>
<td WIDTH="39%"><font SIZE="3"><p ALIGN="JUSTIFY">选项</font></td>
<td WIDTH="61%"><font SIZE="3"><p ALIGN="JUSTIFY">含义</font></td>
</tr>
<tr>
<td WIDTH="39%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">CRecordset::none</font></td>
<td WIDTH="61%"><font SIZE="3"><p ALIGN="JUSTIFY">无选项(缺省).</font></td>
</tr>
<tr>
<td WIDTH="39%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">CRecordset::appendOnly</font></td>
<td WIDTH="61%"><font SIZE="3"><p ALIGN="JUSTIFY">不允许修改和删除记录,但可以添加记录.</font></td>
</tr>
<tr>
<td WIDTH="39%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">CRecordset::readOnly</font></td>
<td WIDTH="61%"><font SIZE="3"><p ALIGN="JUSTIFY">记录集是只读的.</font></td>
</tr>
<tr>
<td WIDTH="39%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">CRecordset::skipDeletedRecords</font></td>
<td WIDTH="61%"><font SIZE="3"><p ALIGN="JUSTIFY">有些数据库(如</font><font FACE="Times New Roman" SIZE="3">FoxPro</font><font SIZE="3">)在删除记录时并不真删除,而是做个删除标记,在滚动时将跳过这些被删除的记录.</font></td>
</tr>
</table>
<p><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>
<blockquote>
<blockquote>
<p ALIGN="JUSTIFY">virtual CString GetDefaultSQL( );<br>
Open</font><font SIZE="3">函数在必要时会调用该函数返回缺省的</font><font FACE="Times New Roman" SIZE="3">SQL</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">SQL</font><font SIZE="3">语句或表名.下面是一些返回字符串的例子.<br>
“</font><font FACE="Times New Roman" SIZE="3">Section</font><font SIZE="3">” </font><font FACE="Times New Roman" SIZE="3">//</font><font SIZE="3">选择</font><font FACE="Times New Roman" SIZE="3">Section</font><font SIZE="3">表中的所有记录到记录集中<br>
“</font><font FACE="Times New Roman" SIZE="3">Section, Course</font><font SIZE="3">” </font><font FACE="Times New Roman" SIZE="3">//</font><font SIZE="3">合并</font><font FACE="Times New Roman" SIZE="3">Section</font><font SIZE="3">表和</font><font FACE="Times New Roman" SIZE="3">Course</font><font SIZE="3">表的各列到记录集中</p>
</font><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">//</font><font SIZE="3">对</font><font FACE="Times New Roman" SIZE="3">Section</font><font SIZE="3">表中的所有记录按</font><font FACE="Times New Roman" SIZE="3">CourseID</font><font SIZE="3">的升序进行排序,然后建立记录集</p>
</font><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY"></font><font SIZE="3">“</font><font FACE="Times New Roman" SIZE="3">SELECT * FROM Section ORDER BY CourseID ASC</font><font SIZE="3">”</font><font FACE="Times New Roman" SIZE="3"></p>
</blockquote>
</blockquote>
<p ALIGN="JUSTIFY"></font><font SIZE="3">上面的例子说明,通过合理地安排</font><font FACE="Times New Roman" SIZE="3">SQL</font><font SIZE="3">语句和表名,</font><font FACE="Times New Roman" SIZE="3">Open</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</font><font SIZE="3">会构造一个</font><font FACE="Times New Roman" SIZE="3">SELECT</font><font SIZE="3">语句来查询数据源.如果在调用</font><font FACE="Times New Roman" SIZE="3">Open</font><font SIZE="3">时只提供了表名,那么</font><font FACE="Times New Roman" SIZE="3">SELECT</font><font SIZE="3">语句还缺少选择列参数</font><font FACE="Times New Roman" SIZE="3">rfx-field-list</font><font SIZE="3">(参见</font><font FACE="Times New Roman" SIZE="3">10.5.3</font><font SIZE="3">).框架规定,如果只提供了表名,则选择列的信息从</font><font FACE="Times New Roman" SIZE="3">DoFieldExchange</font><font SIZE="3">中的</font><font FACE="Times New Roman" SIZE="3">RFX</font><font SIZE="3">语句里提取.例如,如果在调用</font><font FACE="Times New Roman" SIZE="3">Open</font><font SIZE="3">时只提供了"</font><font FACE="Times New Roman" SIZE="3">Section</font><font SIZE="3">"表名,那么将会构造如下一个</font><font FACE="Times New Roman" SIZE="3">SELECT</font><font SIZE="3">语句:</font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">SELECT CourseID,SectionNo,InstructorID,RoomNo, Schedule,Capacity FROM
Section</p>
<p ALIGN="JUSTIFY"></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">Requery</font><font SIZE="3">成员函数来重新查询和建立记录集.</font><font FACE="Times New Roman" SIZE="3">Requery</font><font SIZE="3">有两个重要用途:</p>
<ul>
<li><p ALIGN="JUSTIFY">使记录集能反映用户对数据源的改变(参见<font FACE="Times New Roman" SIZE="3">10.5.1</font>).</p>
</li>
<li><p ALIGN="JUSTIFY">按照新的过滤或排序方法查询记录并重新建立记录集.</font></p>
</li>
</ul>
<p><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">Requery</font><font SIZE="3">之前,可调用</font><font FACE="Times New Roman" SIZE="3">CanRestart</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">Requery</font><font SIZE="3">只能在成功调用</font><font FACE="Times New Roman" SIZE="3">Open</font><font SIZE="3">后调用,所以程序应调用</font><font FACE="Times New Roman" SIZE="3">IsOpen</font><font SIZE="3">来判断记录集是否已建立.函数的声明为</p>
<blockquote>
<blockquote>
</font><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">virtual BOOL Requery(
);throw( CDBException, CMemoryException );<br>
</font><font SIZE="3">返回</font><font FACE="Times New Roman" SIZE="3">TRUE</font><font SIZE="3">表明记录集建立成功,否则返回</font><font FACE="Times New Roman" SIZE="3">FALSE</font><font SIZE="3">.若函数内部出错则产生异常.</p>
</font><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">BOOL CanRestart( ) const;
//</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">TRUE</p>
<p ALIGN="JUSTIFY">BOOL IsOpen( ) const; //</font><font SIZE="3">若记录集已建立则返回</font><font FACE="Times New Roman" SIZE="3">TRUE</p>
</blockquote>
</blockquote>
<p ALIGN="JUSTIFY">CRecordset</font><font SIZE="3">类有两个公共数据成员</font><font FACE="Times New Roman" SIZE="3">m_strFilter</font><font SIZE="3">和</font><font FACE="Times New Roman" SIZE="3">m_strSort</font><font SIZE="3">用来设置对记录的过滤和排序.在调用</font><font FACE="Times New Roman" SIZE="3">Open</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">Open</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">m_strFilter</font><font SIZE="3">用于指定过滤器.</font><font FACE="Times New Roman" SIZE="3">m_strFilter</font><font SIZE="3">实际上包含了</font><font FACE="Times New Roman" SIZE="3">SQL</font><font SIZE="3">的</font><font FACE="Times New Roman" SIZE="3">WHERE</font><font SIZE="3">子句的内容,但它不含</font><font FACE="Times New Roman" SIZE="3">WHERE</font><font SIZE="3">关键字.使用</font><font FACE="Times New Roman" SIZE="3">m_strFilter</font><font SIZE="3">的一个例子为:</font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">m_pSet->m_strFilter=</font><font SIZE="3">“</font><font FACE="Times New Roman" SIZE="3">CourseID=</font><font SIZE="3">‘</font><font FACE="Times New Roman" SIZE="3">MATH101</font><font SIZE="3">’”</font><font FACE="Times New Roman" SIZE="3">; //</font><font SIZE="3">只选择</font><font FACE="Times New Roman" SIZE="3">CourseID</font><font SIZE="3">为</font><font FACE="Times New Roman" SIZE="3">MATH101</font><font SIZE="3">的记录</font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">if(m_pSet->Open(CRecordset::snapshot, </font><font SIZE="3">“</font><font FACE="Times New Roman" SIZE="3">Section</font><font SIZE="3">”</font><font FACE="Times New Roman" SIZE="3">))</p>
<p ALIGN="JUSTIFY"><b>. . . . . .</b></p>
<p ALIGN="JUSTIFY"></font><font SIZE="3">成员</font><font FACE="Times New Roman" SIZE="3">m_strSort</font><font SIZE="3">用于指定排序.</font><font FACE="Times New Roman" SIZE="3">m_strSort</font><font SIZE="3">实际上包含了</font><font FACE="Times New Roman" SIZE="3">ORDER BY</font><font SIZE="3">子句的内容,但它不含</font><font FACE="Times New Roman" SIZE="3">ORDER BY</font><font SIZE="3">关键字.</font><font FACE="Times New Roman" SIZE="3">m_strSort</font><font SIZE="3">的一个例子为</font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">m_pSet->m_strSort=</font><font SIZE="3">“</font><font FACE="Times New Roman" SIZE="3">CourseID DESC</font><font SIZE="3">”</font><font FACE="Times New Roman" SIZE="3">; //</font><font SIZE="3">按</font><font FACE="Times New Roman" SIZE="3">CourseID</font><font SIZE="3">的降序排列记录</font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">m_pSet->Open();</p>
<p ALIGN="JUSTIFY"><b>. . . . . .</b></p>
<p ALIGN="JUSTIFY"></font><font SIZE="3">事实上,</font><font FACE="Times New Roman" SIZE="3">Open</font><font SIZE="3">函数在构造</font><font FACE="Times New Roman" SIZE="3">SELECT</font><font SIZE="3">语句时,会把</font><font FACE="Times New Roman" SIZE="3">m_strFilter</font><font SIZE="3">和</font><font FACE="Times New Roman" SIZE="3">m_strSort</font><font SIZE="3">的内容放入</font><font FACE="Times New Roman" SIZE="3">SELECT</font><font SIZE="3">语句的</font><font FACE="Times New Roman" SIZE="3">WHERE</font><font SIZE="3">和</font><font FACE="Times New Roman" SIZE="3">ORDER BY</font><font SIZE="3">子句中.如果在</font><font FACE="Times New Roman" SIZE="3">Open</font><font SIZE="3">的</font><font FACE="Times New Roman" SIZE="3">lpszSQL</font><font SIZE="3">参数中已包括了</font><font FACE="Times New Roman" SIZE="3">WHERE</font><font SIZE="3">和</font><font FACE="Times New Roman" SIZE="3">ORDER BY</font><font SIZE="3">子句,那么</font><font FACE="Times New Roman" SIZE="3">m_strFilter</font><font SIZE="3">和</font><font FACE="Times New Roman" SIZE="3">m_strSort</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">Close</font><font SIZE="3">可以关闭记录集.在调用了</font><font FACE="Times New Roman" SIZE="3">Close</font><font SIZE="3">函数后,程序可以再次调用</font><font FACE="Times New Roman" SIZE="3">Open</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">Close</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></font><b><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY"></font></b><font color="#3973DE" FACE="Times New Roman" SIZE="3">10.5.5
</font><font SIZE="3" color="#3973DE">滚动记录</font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">CRecordset</font><font SIZE="3">提供了几个成员函数用来在记录集中滚动,如下所示.当用这些函数滚动到一个新记录时,框架会自动地把新记录的内容拷贝到域数据成员中.</p>
<blockquote>
<blockquote>
</font><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">void MoveNext( ); //</font><font SIZE="3">前进一个记录</p>
</font><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">void MovePrev( ); //</font><font SIZE="3">后退一个记录</p>
</font><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">void MoveFirst( ); //</font><font SIZE="3">滚动到记录集中的第一个记录</p>
</font><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">void MoveLast( ); //</font><font SIZE="3">滚动到记录集中的最后一个记录</p>
</font><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">void SetAbsolutePosition(
long nRows ); <br>
</font><font SIZE="3">该函数用于滚动到由参数</font><font FACE="Times New Roman" SIZE="3">nRows</font><font SIZE="3">指定的绝对位置处.若</font><font FACE="Times New Roman" SIZE="3">nRows</font><font SIZE="3">为负数,则从后往前滚动.例如,当</font><font FACE="Times New Roman" SIZE="3">nRows</font><font SIZE="3">为</font><font FACE="Times New Roman" SIZE="3">-1</font><font SIZE="3">时,函数就滚动到记录集的末尾.注意,该函数不会跳过被删除的记录.</p>
</font><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">virtual void Move( long
nRows, WORD wFetchType = SQL_FETCH_RELATIVE );<br>
</font><font SIZE="3">该函数功能强大.通过将</font><font FACE="Times New Roman" SIZE="3">wFetchType</font><font SIZE="3">参数指定为</font><font FACE="Times New Roman" SIZE="3">SQL_FETCH_NEXT</font><font SIZE="3">、</font><font FACE="Times New Roman" SIZE="3">SQL_FETCH_PRIOR</font><font SIZE="3">、</font><font FACE="Times New Roman" SIZE="3">SQL_FETCH_FIRST</font><font SIZE="3">、</font><font FACE="Times New Roman" SIZE="3">SQL_FETCH_LAST</font><font SIZE="3">和</font><font FACE="Times New Roman" SIZE="3">SQL_FETCH_ABSOLUTE</font><font SIZE="3">,可以完成上面五个函数的功能.若</font><font FACE="Times New Roman" SIZE="3">wFetchType</font><font SIZE="3">为</font><font FACE="Times New Roman" SIZE="3">SQL_FETCH_RELATIVE</font><font SIZE="3">,那么将相对当前记录移动,若</font><font FACE="Times New Roman" SIZE="3">nRows</font><font SIZE="3">为正数,则向前移动,若</font><font FACE="Times New Roman" SIZE="3">nRows</font><font SIZE="3">为负数,则向后移动.</font></p>
</blockquote>
</blockquote>
<p><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -