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

📄 sy0702.htm

📁 c语言经典教程
💻 HTM
字号:
<html>
<head>
<title>无标题文档</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>

<body bgcolor="#FFFFFF" text="#000000">
<p> <font color="#0000FF">使用ODBC类访问数据库</font><br>
  <br>
  (一)实验目的<br>
  使用MFC的ODBC类——CDatabase和CRecordSet访问数据库<br>
  <br>
  (二)实验内容 <br>
  ODBC是Microsoft定义的开发数据库互连标准,它不但定义了SQL语法规则,而且还定义了C语言同SQL数据库之间的编程接口。通过ODBC,可以在C或C++程序中对任何带有ODBC驱动程序的DBMS进行访问。MFC对ODBC进行了封装,CDatabase和 
  CRecordSet类为MFC的两个最主要的ODBC类。CDatabase类用来打开数据库,它的对象代表了和数据源的ODBC连接;CRecordSet类用来打开数据库中的表并读取其中的记录,它的对象则代表了可滚动行集(记录集)。<br>
  <br>
  下表是CRecordSet类的一些比较重要的成员函数</p>
<table border="1">
  <tr> 
    <td><b>函数</b></td>
    <td><b>说明</b></td>
  </tr>
  <tr> 
    <td>Open</td>
    <td>打开记录集</td>
  </tr>
  <tr> 
    <td>AddNew</td>
    <td>准备把一个新的记录加入到表中</td>
  </tr>
  <tr> 
    <td>Edit</td>
    <td>准备执行对当前记录的修改</td>
  </tr>
  <tr> 
    <td>Update</td>
    <td>完成AddNew或Edit操作,把数据保存到数据源中</td>
  </tr>
  <tr> 
    <td>Delete</td>
    <td>删除记录集中当前记录</td>
  </tr>
  <tr> 
    <td>IsBOF</td>
    <td>判断记录集是否被定位到第一个记录的前面</td>
  </tr>
  <tr> 
    <td>IsEOF</td>
    <td>判断记录集是否被定位到最后一个记录的后面</td>
  </tr>
  <tr> 
    <td>MoveFirst</td>
    <td>把当前记录设置到记录集中的第一个记录</td>
  </tr>
  <tr> 
    <td>MoveLast</td>
    <td>把当前记录设置到记录集中的最后一个记录</td>
  </tr>
  <tr> 
    <td>MoveNext</td>
    <td>把当前记录设置到下一个记录</td>
  </tr>
  <tr> 
    <td>MovePrev</td>
    <td>把当前记录设置到上一个记录</td>
  </tr>
  <tr>
    <td>Requery</td>
    <td>重新向数据源查询更新记录集</td>
  </tr>
  <tr> 
    <td>GetDefaultConnect</td>
    <td>虚函数,通过重载建立与指定的数据源的连接</td>
  </tr>
  <tr> 
    <td>GetDefaultSQL</td>
    <td>虚函数,通过重载获得所需的数据</td>
  </tr>
</table>
<p>(三)实验步骤<br>
  <br>
  1.下载示例Access数据库<a href="STDREG32.MDB">stdreg32.mdb</a><br>
  <br>
  2.运行ODBC数据源管理程序来安装学生注册数据<br>
  <br>
  在Windows控制面板中单击ODBC图标,启动“ODBC数据源管理器”,选择“用户DSN”,单击“添加”按钮,在“创建新数据源”对话框中选择“Microsoft 
  Access Driver”,单击“完成”,在“ODBC Microsoft Access安装”对话框中,数据源名填“Student”,点击“选择”,选中stdreg32.mdb,完成<br>
</p>
<p>3.新建MFC工程,应用程序类型指定为SDI(Step1),数据库支持选择Header Files Only(Step2),视图的基类指定为CScrollView(Step6)。<br>
  <br>
  4.用ClassWizard创建CStudentSet记录集类。从Add Class菜单中选择New,类名为CStudentSet,基类为CRecordset。确定后会显示Database 
  Options对话框,Datasource选择刚才创建的Student数据源,并选择Dynaset选项。选择数据源后会提示我们选择一个表,请选择Student表。<br>
  <br>
  5.在ClassWizard的Member Variables页可以看到CStudentSet按照Student表的列名产生了对应的数据成员。<br>
  <br>
  6.在Document类的头文件前包含CStudentSet的声明,#include &quot;StudentSet.h&quot;<br>
  <br>
  7.在Document类加入public类型的数据成员CStudentSet m_Set; 在View类加入数据成员CStudentSet* m_pSet;<br>
  <br>
  8.在View类的OnDraw中加入代码</p>
  <pre>    TEXTMETRIC tm;
    pDC->GetTextMetrics(&tm);
    int nLineHeight=tm.tmHeight+tm.tmExternalLeading;

    CPoint pText(0,0);
    CString str;
    if (m_pSet->IsBOF()) { // detects empty recordset
        return;
    }
    m_pSet->MoveFirst();   // fails if recordset is empty
    while (!m_pSet->IsEOF()) {
        str.Format("%ld", m_pSet->m_StudentID);
        pDC->TextOut(pText.x, pText.y, str);
        pDC->TextOut(pText.x+1000, pText.y, m_pSet->m_Name);
        str.Format("%d", m_pSet->m_GradYear);
        pDC->TextOut(pText.x+4000, pText.y, str);
        m_pSet->MoveNext();
        pText.y -= nLineHeight;
    }
</pre>
<p>9.用ClassWizard在View类加入OnInitialUpdate(),并加入代码</p>
<pre>    CSize sizeTotal(8000, 10500);
    SetScrollSizes(MM_HIENGLISH, sizeTotal);

    m_pSet = &GetDocument()->m_Set;
    // Remember that documents/views are reused in SDI applications!
    if (m_pSet->IsOpen()) {
        m_pSet->Close();
    }
    m_pSet->Open();
</pre>
<p>10.编译并测试应用程序。</p>
<p>·执行不返回结果集的SQL语句</p>
<p> 1.插入记录。可在View类合适的位置加入如下代码观察效果:<br>
  m_pSet-&gt;m_pDatabase-&gt;ExecuteSQL(&quot;INSERT INTO Student VALUES(11,'Mike',95)&quot;);<br>
  m_pSet-&gt;Requery();<br>
  Invalidate();<br>
</p>
<p>2.修改记录。可在View类合适的位置加入如下代码观察效果:</p>
<p> m_pSet-&gt;m_pDatabase-&gt;ExecuteSQL(&quot;UPDATE Student SET Name='Tom' 
  WHERE StudentID=11&quot;);<br>
  m_pSet-&gt;Requery();<br>
  Invalidate();<br>
</p>
<p>2.删除记录。可在View类合适的位置加入如下代码观察效果:</p>
<p> m_pSet-&gt;m_pDatabase-&gt;ExecuteSQL(&quot;DELETE FROM Student WHERE StudentID=11&quot;);<br>
  m_pSet-&gt;Requery();<br>
  Invalidate();<br>
</p>
<p>·下面两种方法可以用来筛选特定的记录,两种方法通常不可混用,第二种方法更为一般</p>
<p>1.可以在m_pSet->Open()前加入m_pSet-&gt;m_strFilter=&quot;StudentID&gt;1010&quot;。m_strFilter用来存放SQL查询语句WHERE子句的文本内容(不包括字“WHERE”)</p>
<p>2.也可修改CStudentSet的GetDefaultSQL函数,把原来的return _T(&quot;[Student]&quot;)改为 return 
  _T(&quot;SELECT * from Student&quot;)或 return _T(&quot;SELECT * from Student 
  WHERE GradYear=96&quot;)。实际上CRecordSet代表的数据是通过该SQL语句从数据源中获得的。<br>
  <br>
  <br>
</p>
</body>
</html>

⌨️ 快捷键说明

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