⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chap10_5.htm

📁 VC++编程实例。非常详细
💻 HTM
📖 第 1 页 / 共 3 页
字号:
              </td>
              <td width="14%">
                <p align="JUSTIFY">3
              </td>
              <td width="18%">
                <p align="JUSTIFY">KLAUSENJ
              </td>
              <td width="19%">
                <p align="JUSTIFY">WIL-2033
              </td>
              <td width="18%">
                <p align="JUSTIFY">TTH3-4:30
              </td>
              <td width="14%">
                <p align="JUSTIFY">15
              </td>
            </tr>
          </table>
          <b>
          <p align="JUSTIFY">清单10.1 派生类中的域数据成员</p>
          </b>
          <blockquote>
            <blockquote> <b> </b>
              <p align="JUSTIFY">class CSectionSet : public CRecordset</p>
              <p align="JUSTIFY">{</p>
              <p align="JUSTIFY">public:</p>
              <p align="JUSTIFY"><b>. . . . . .</b></p>
              <p align="JUSTIFY">//{{AFX_FIELD(CSectionSet, CRecordset)</p>
              <p align="JUSTIFY">CString m_CourseID;</p>
              <p align="JUSTIFY">CString m_SectionNo;</p>
              <p align="JUSTIFY">CString m_InstructorID;</p>
              <p align="JUSTIFY">CString m_RoomNo;</p>
              <p align="JUSTIFY">CString m_Schedule;</p>
              <p align="JUSTIFY">int m_Capacity;</p>
              <p align="JUSTIFY">//}}AFX_FIELD</p>
              <p align="JUSTIFY"><b>. . . . . .</b></p>
              <p align="JUSTIFY">};</p>
              <p align="JUSTIFY"> </p>
            </blockquote>
          </blockquote>
          <p align="JUSTIFY">  域数据成员用来保存某条记录的各个字段,它们是程序与记录之间的缓冲区.域数据成员代表当前记录,当在记录集中滚动到某一记录时,框架自动地把记录的各个字段拷贝到记录集对象的域数据成员中.当用户要修改当前记录或增加新记录时,程序先将各字段的新值放入域数据成员中,然后调用相应的CRecordset成员函数把域数据成员设置到数据源中.</p>
          <p align="JUSTIFY">  不难看出,在记录集与数据源之间有一个数据交换问题.CRecordset类使用"记录域交换"(Record 
            Field Exchange,缩写为RFX)机制自动地在域数据成员和数据源之间交换数据.RFX机制与对话数据交换(DDX)类似.CRecordset的成员函数DoFieldExchange负责数据交换任务,在该函数中调用了一系列RFX函数.当用户用ClassWizard加入域数据成员时,ClassWizard会自动在DoFieldExchange中建立RFX.典型DoFieldExchange如清单10.2所示:</p>
          <p align="JUSTIFY">清单10.2 典型的DoFieldExchange函数</p>
          <b></b> 
          <p align="JUSTIFY">void CSectionSet::DoFieldExchange(CFieldExchange* 
            pFX)</p>
          <p align="JUSTIFY">{</p>
          <p align="JUSTIFY">//{{AFX_FIELD_MAP(CSectionSet)</p>
          <p align="JUSTIFY">pFX-&gt;SetFieldType(CFieldExchange::outputColumn);</p>
          <p align="JUSTIFY">RFX_Text(pFX, _T(&quot;[CourseID]&quot;), m_CourseID);</p>
          <p align="JUSTIFY">RFX_Text(pFX, _T(&quot;[SectionNo]&quot;), m_SectionNo);</p>
          <p align="JUSTIFY">RFX_Text(pFX, _T(&quot;[InstructorID]&quot;), m_InstructorID);</p>
          <p align="JUSTIFY">RFX_Text(pFX, _T(&quot;[RoomNo]&quot;), m_RoomNo);</p>
          <p align="JUSTIFY">RFX_Text(pFX, _T(&quot;[Schedule]&quot;), m_Schedule);</p>
          <p align="JUSTIFY">RFX_Int(pFX, _T(&quot;[Capacity]&quot;), m_Capacity);</p>
          <p align="JUSTIFY">//}}AFX_FIELD_MAP</p>
          <p align="JUSTIFY">}</p>
          <p><b> </b></p>
          <p align="JUSTIFY"> <b></b> </p>
          <p align="JUSTIFY"><b></b><font color="#3973DE" face="Times New Roman" size="3">10.5.3 
            SQL</font><font size="3" color="#3973DE">查询</font></p>
          <p align="JUSTIFY">  记录集的建立实际上主要是一个查询过程,SQL的SELECT语句用来查询数据源.在建立记录集时,CRecordset会根据一些参数构造一个SELECT语句来查询数据源,并用查询的结果创建记录集.明白这一点对理解CRecordset至关重要.SELECT语句的句法如下:</p>
          <p align="JUSTIFY">SELECT rfx-field-list FROM table-name [WHERE m_strFilter] 
          </p>
          <p align="JUSTIFY">[ORDER BY m_strSort]</p>
          <p align="JUSTIFY"><b></b>  其中table-name是表名,rfx-field-list是选择的列(字段).WHERE和ORDER 
            BY是两个子句,分别用来过滤和排序。下面是SELECT语句的一些例子:</p>
          <blockquote> 
            <p align="JUSTIFY">SELECT CourseID, InstructorID FROM Section </p>
            <p align="JUSTIFY">SELECT * FROM Section WHERE CourseID=‘MATH202’ 
              AND Capacity=15</p>
            <p align="JUSTIFY">SELECT InstructorID FROM Section ORDER BY CourseID 
              ASC</p>
          </blockquote>
          <p align="JUSTIFY">  其中第一个语句从Section表中选择CourseID和InstructorID字段.第二个语句从Section表中选择CourseID为MATH202且Capacity等于15的记录,在该语句中使用了象"AND"或"OR"这样的逻辑连接符.要注意在SQL语句中引用字符串、日期或时间等类型的数据时要用单引号括起来,而数值型数据则不用.第三个语句从Section表中选择InstructorID列并且按CourseID的升序排列,若要降序排列,可使用关键字DESC.</p>
          <div align="center">
            <center>
              <table border="2" cellpadding="2" cellspacing="0" width="100%" bgcolor="#71D0FF">
                <tr> 
                  <td width="100%"> <b></b>提示:如果列名或表名中包含有空格,则必需用方括号把该名称包起来。例如,如果有一列名为“Client 
                    Name”,则应该写成“[Client Name]”。<b></b></td>
                </tr>
              </table>
            </center>
          </div>
          <p align="JUSTIFY"> </p>
          <p align="JUSTIFY"><font color="#3973DE" face="Times New Roman" size="3">10.5.4 
            </font><font size="3" color="#3973DE">记录集的建立和关闭</font></p>
          <p align="JUSTIFY">  要建立记录集,首先要构造一个CRecordset派生类对象,然后调用Open成员函数查询数据源中的记录并建立记录集.在Open函数中,可能会调用GetDefaultConnect和GetDefaultSQL函数.函数的声明为</p>
          <blockquote> 
            <blockquote> 
              <p align="JUSTIFY">CRecordset( CDatabase* pDatabase = NULL);<br>
                参数pDatabase指向一个CDatabase对象,用来获取数据源.如果pDatabase为NULL,则会在Open函数中自动构建一个CDatabase对象.如果CDatabase对象还未与数据源连接,那么在Open函数中会建立连接,连接字符串(参见10.3.1)由成员函数GetDefaultConnect提供.</p>
              <p align="JUSTIFY">virtual CString GetDefaultConnect( );<br>
                该函数返回缺省的连接字符串.Open函数在必要的时侯会调用该函数获取连接字符串以建立与数据源的连接.一般需要在CRecordset派生类中覆盖该函数并在新版的函数中提供连接字符串.</p>
              <p align="JUSTIFY">virtual BOOL Open( UINT nOpenType = AFX_DB_USE_DEFAULT_TYPE, 
                LPCTSTR lpszSQL = NULL, DWORD dwOptions = none );<br>
                throw( CDBException, CMemoryException );<br>
                该函数使用指定的SQL语句查询数据源中的记录并按指定的类型和选项建立记录集.参数nOpenType说明了记录集的类型,如表10.3所示,如果要求的类型驱动程序不支持,则函数将产生一个异常.参数lpszSQL是一个SQL的SELECT语句,或是一个表名.函数用lpszSQL来进行查询,如果该参数为NULL,则函数会调用GetDefaultSQL获取缺省的SQL语句.参数dwOptions可以是一些选项的组合,常用的选项在表10.4中列出.若创建成功则函数返回TRUE,若函数调用了CDatabase::Open且返回FALSE,则函数返回FALSE.</p>
            </blockquote>
          </blockquote>
          <p><b> </b></p>
          <b> 
          <p align="CENTER">表10.3 记录集的类型</p>
          </b> 
          <table border="1" cellspacing="1" cellpadding="1" width="579">
            <tr> 
              <td width="39%">
                <p align="JUSTIFY">类型
              </td>
              <td width="61%">
                <p align="JUSTIFY">含义
              </td>
            </tr>
            <tr> 
              <td width="39%">
                <p align="JUSTIFY">AFX_DB_USE_DEFAULT_TYPE
              </td>
              <td width="61%">
                <p align="JUSTIFY">使用缺省值.
              </td>
            </tr>
            <tr> 
              <td width="39%">
                <p align="JUSTIFY">CRecordset::dynaset
              </td>
              <td width="61%">
                <p align="JUSTIFY">可双向滚动的动态集.
              </td>
            </tr>
            <tr> 
              <td width="39%">
                <p align="JUSTIFY">CRecordset::snapshot
              </td>
              <td width="61%">
                <p align="JUSTIFY">可双向滚动的快照.
              </td>
            </tr>
            <tr> 
              <td width="39%">
                <p align="JUSTIFY">CRecordset::dynamic
              </td>
              <td width="61%">
                <p align="JUSTIFY">提供比动态集更好的动态特性,大部分ODBC驱动程序不支持这种记录集.
              </td>
            </tr>
            <tr> 
              <td width="39%">
                <p align="JUSTIFY">CRecordset::forwardOnly
              </td>
              <td width="61%">
                <p align="JUSTIFY">只能前向滚动的只读记录集.
              </td>
            </tr>
          </table>
          <p> </p>
          <p align="JUSTIFY"> </p>
          <p align="CENTER"><b>表10.4 创建记录集时的常用选项</b></p>
          <table border="1" cellspacing="1" cellpadding="1" width="579">
            <tr> 
              <td width="39%">
                <p align="JUSTIFY">选项
              </td>
              <td width="61%">
                <p align="JUSTIFY">含义
              </td>
            </tr>
            <tr> 
              <td width="39%">
                <p align="JUSTIFY">CRecordset::none
              </td>
              <td width="61%">
                <p align="JUSTIFY">无选项(缺省).
              </td>
            </tr>
            <tr> 
              <td width="39%">
                <p align="JUSTIFY">CRecordset::appendOnly
              </td>
              <td width="61%">
                <p align="JUSTIFY">不允许修改和删除记录,但可以添加记录.
              </td>
            </tr>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -