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

📄 chap10_5.htm

📁 着重介绍基于C++的web编程技术
💻 HTM
📖 第 1 页 / 共 4 页
字号:
        <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">3</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">WIL-2033</font></td>
        <td WIDTH="18%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">TTH3-4:30</font></td>
        <td WIDTH="14%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">15</font></td>
      </tr>
    </table>
    <b><font SIZE="3"><p ALIGN="JUSTIFY">清单</font><font FACE="Times New Roman" SIZE="3">10.1 
    </font><font SIZE="3">派生类中的域数据成员</p>
    <blockquote>
      <blockquote>
        </font></b><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">class CSectionSet : 
        public CRecordset</p>
        <p ALIGN="JUSTIFY">{</p>
        <p ALIGN="JUSTIFY">public:</p>
        <p ALIGN="JUSTIFY"><b>. . . . . .</p>
        </b><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>. . . . . .</p>
        </b><p ALIGN="JUSTIFY">};</p>
        <p ALIGN="JUSTIFY"></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">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</font><font SIZE="3">类使用"记录域交换"</font><font FACE="Times New Roman" SIZE="3">(Record Field Exchange</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">RFX</font><font SIZE="3">机制与对话数据交换</font><font FACE="Times New Roman" SIZE="3">(DDX)</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">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">ClassWizard</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">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">DoFieldExchange</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"></p>
    <p ALIGN="JUSTIFY"></font><b><font SIZE="3"> </p>
    <p ALIGN="JUSTIFY">清单</font><font FACE="Times New Roman" SIZE="3">10.2 </font><font SIZE="3">典型的</font><font FACE="Times New Roman" SIZE="3">DoFieldExchange</font><font SIZE="3">函数</font></b><font FACE="Times New Roman" SIZE="3"></p>
    <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></font><b><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
    <p ALIGN="JUSTIFY"></font></b><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.3 
    SQL</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">SQL</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">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">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"></p>
    <p ALIGN="JUSTIFY">SELECT rfx-field-list FROM table-name [WHERE m_strFilter] </p>
    <p ALIGN="JUSTIFY">[ORDER BY m_strSort]</p>
    <b><p ALIGN="JUSTIFY"></b></font><font SIZE="3">其中</font><font FACE="Times New Roman" SIZE="3">table-name</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">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">SELECT</font><font SIZE="3">语句的一些例子:</p>
    <blockquote>
      </font><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">SELECT CourseID, 
      InstructorID FROM Section </p>
      <p ALIGN="JUSTIFY">SELECT * FROM Section WHERE CourseID=</font><font SIZE="3">‘</font><font FACE="Times New Roman" SIZE="3">MATH202</font><font SIZE="3">’ </font><font FACE="Times New Roman" SIZE="3">AND Capacity=15</p>
      <p ALIGN="JUSTIFY">SELECT InstructorID FROM Section ORDER BY CourseID ASC</p>
    </blockquote>
    <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">和</font><font FACE="Times New Roman" SIZE="3">InstructorID</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">为</font><font FACE="Times New Roman" SIZE="3">MATH202</font><font SIZE="3">且</font><font FACE="Times New Roman" SIZE="3">Capacity</font><font SIZE="3">等于</font><font FACE="Times New Roman" SIZE="3">15</font><font SIZE="3">的记录,在该语句中使用了象"</font><font FACE="Times New Roman" SIZE="3">AND</font><font SIZE="3">"或"</font><font FACE="Times New Roman" SIZE="3">OR</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">Section</font><font SIZE="3">表中选择</font><font FACE="Times New Roman" SIZE="3">InstructorID</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">DESC</font><font SIZE="3">.</font><font FACE="Times New Roman" SIZE="3"></p>
    </font><font SIZE="3"><b><div align="center"><center><table border="2" cellpadding="2" cellspacing="0" width="100%" bgcolor="#71D0FF">
      <tr>
        <td width="100%"></b>提示:如果列名或表名中包含有空格,则必需用方括号把该名称包起来。例如,如果有一列名为“</font><font FACE="Times New Roman" SIZE="3">Client Name</font><font SIZE="3">”,则应该写成“</font><font FACE="Times New Roman" SIZE="3">[Client Name]</font><font SIZE="3">”。<b></b></font></td>
      </tr>
    </table>
    </center></div><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY"></font><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
    <p ALIGN="JUSTIFY"></font><font color="#3973DE" FACE="Times New Roman" SIZE="3">10.5.4 </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">CRecordset</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">Open</font><font SIZE="3">函数中,可能会调用</font><font FACE="Times New Roman" SIZE="3">GetDefaultConnect</font><font SIZE="3">和</font><font FACE="Times New Roman" SIZE="3">GetDefaultSQL</font><font SIZE="3">函数.函数的声明为</p>
    <blockquote>
      <blockquote>
        </font><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">CRecordset( CDatabase* 
        pDatabase = NULL);<br>
        </font><font SIZE="3">参数</font><font FACE="Times New Roman" SIZE="3">pDatabase</font><font SIZE="3">指向一个</font><font FACE="Times New Roman" SIZE="3">CDatabase</font><font SIZE="3">对象,用来获取数据源.如果</font><font FACE="Times New Roman" SIZE="3">pDatabase</font><font SIZE="3">为</font><font FACE="Times New Roman" SIZE="3">NULL</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">CDatabase</font><font SIZE="3">对象.如果</font><font FACE="Times New Roman" SIZE="3">CDatabase</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">10.3.1</font><font SIZE="3">)由成员函数</font><font FACE="Times New Roman" SIZE="3">GetDefaultConnect</font><font SIZE="3">提供.</p>
        </font><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">virtual CString 
        GetDefaultConnect( );<br>
        </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">派生类中覆盖该函数并在新版的函数中提供连接字符串.</p>
        </font><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">virtual BOOL Open( UINT 
        nOpenType = AFX_DB_USE_DEFAULT_TYPE, LPCTSTR lpszSQL = NULL, DWORD dwOptions = none );<br>
        throw( CDBException, CMemoryException );<br>
        </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">nOpenType</font><font SIZE="3">说明了记录集的类型,如表</font><font FACE="Times New Roman" SIZE="3">10.3</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">SQL</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">lpszSQL</font><font SIZE="3">来进行查询,如果该参数为</font><font FACE="Times New Roman" SIZE="3">NULL</font><font SIZE="3">,则函数会调用</font><font FACE="Times New Roman" SIZE="3">GetDefaultSQL</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">dwOptions</font><font SIZE="3">可以是一些选项的组合,常用的选项在表</font><font FACE="Times New Roman" SIZE="3">10.4</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">CDatabase::Open</font><font SIZE="3">且返回</font><font FACE="Times New Roman" SIZE="3">FALSE</font><font SIZE="3">,则函数返回</font><font FACE="Times New Roman" SIZE="3">FALSE</font><font SIZE="3">.</p>
        </font>
      </blockquote>
    </blockquote>
    <p><b><font SIZE="3"> </p>
    <p ALIGN="CENTER">表</font><font FACE="Times New Roman" SIZE="3">10.3 </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">AFX_DB_USE_DEFAULT_TYPE</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::dynaset</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::snapshot</font></td>
        <td WIDTH="61%"><font SIZE="3"><p ALIGN="JUSTIFY">可双向滚动的快照.</font></td>

⌨️ 快捷键说明

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