VC中ODBC数据库技术应用源程序详解

  • 格式:doc
  • 大小:125.50 KB
  • 文档页数:11

VC中ODBC数据库技术应用源程序详解之一(串口数据保存相关)北京理工大学机器人研究中心熊光明龚建伟摘要:本文通过实例详细介绍了VC中ODBC数据库技术的编程应用,数据库源为ACCESS。

本文源程序下载database1.zip 47KB VC6.0 Win9X/2000我们在编程时要保存各种实时接收的数据,并为以后的数据再现回放,就应该建立数据文件,而这种数据文件可以用普通文件读写方式,但当数据类型较多且要求随时回放数据时,要求编程时设置较大的动态数组,这会占用较多的系统资源,甚至导致程序崩溃;而利用数据库则可以较好地解决这个问题,我们将数据放到数据源文件中,通过编程接口对其进行访问。

ODBC(开放的数据库连接:Open Database Connectivity)为各种类型的数据库管理系统提供了统一的编程接口,我们在下面的几篇文章中,首先通过实例说明ODBC技术的应用方法,然后说明如何将串口数据实时保存在数据源文件中,这一方面介绍VC中ODBC技术的应用(前面的例子不涉及串口技术,以方便只想了解ODBC技术的读者,又为利用ODBC 技术保存串口编程数据提供范例,虽然前面几个例程与串口通讯不相关,但如果对使用数据库不熟悉,也请从前面有耐心地看下去。

1.首先在控制面板中,打开ODBC数据源,点击用户DSN选项,在出现的界面中点击添加,如下图所示:然后,点击完成按钮,出现下图,填入数据源名(可随意取名,本处设为biao)点击确定即可。

2.在ACCESS中创建数据库,本例中为data(只包含 number,name,score三列),可从我提供的这个例子下COPY3.建立应用程序项目(1)打开File 菜单的New 选项,选取Projects,选择MFC AppWizard (exe),填入工程名,本例为DATA1(2)把数据库文件 data拷入新建的工程目录。

(3)应用程序的类型指定为SDI,在Step2 对话框中选择Header Files Only选项,在Step6是将视图基类指定为CScrollView。

(4)用ClassWizard 创建记录集类。

从Add Class菜单中选择New,并按下图填充对话框:(说明:一个CRecordset对象代表从数据源中查询的一个记录集。

)(5).点击OK,进入Data Source,选择biao数据源,并选择Dynast选项,如下图所示:在选择了数据源之后,ClassWizard提示我们选择一个表。

如下图所示:(6)在ClassWizard中,针对新产生的CDataSet类,单击Member Variables标签。

此时ClassWizard 应按照数据库列的名称产生了如下的数据成员:(7)在CData1View类中添加数据成员(8) 在Cdata1Doc中添加如下成员:(9)编辑DATA1View.cpp中的OnDraw() 和OnInitialUpdate()函数:void CDATA1View::OnDraw(CDC* pDC){CDATA1Doc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data hereTEXTMETRIC tm;pDC->GetTextMetrics(&tm);int nLineHeight=tm.tmHeight+tm.tmExternalLeading;CPoint pText(0,0);int y = 0;CString str;if (m_pSet->IsBOF()) { // detects empty recordsetreturn;}m_pSet->MoveFirst(); // fails if recordset is empty while (!m_pSet->IsEOF()) {pDC->TextOut(pText.x, pText.y, m_pSet->m_number); pDC->TextOut(pText.x+1000, pText.y, m_pSet->m_name); pDC->TextOut(pText.x+4000, pText.y, m_pSet->m_score); m_pSet->MoveNext();pText.y -= nLineHeight;}}void CDATA1View::OnInitialUpdate(){CScrollView::OnInitialUpdate();CSize sizeTotal(8000, 10500);SetScrollSizes(MM_HIENGLISH, sizeTotal);m_pSet = &GetDocument()->m_dataSet;if (m_pSet->IsOpen()) {m_pSet->Close();}m_pSet->Open();}(10) data1View.cpp 中加入#include "dataSet.h" (11)编译结果应如下所示:请继续看一篇如何在在数据库中动态修改数据库记录。

VC中ODBC数据库技术应用源程序详解之二(串口数据保存相关)北京理工大学机器人研究中心熊光明龚建伟摘要:本文先按一般方法详述如何动态在数据库中添加、删除记录,然后说明如何将串口实时接收的数据加入数据库中。

数据库源为ACCESS。

本文源程序下载database2.zip 51KB VC6.0 Win9X/2000首先,按上一篇文章步骤一二,分别安装注册数据源及创建数据库。

然后开始以下的步骤:1.建立一个基于单文档的应用程序。

生成新的工程名,本例为data2,在Step1中选择SDI,Step2中选择Database View Without File Support,同时在Step2对话框中,单击Data Source按钮,与上一篇文章一样,为CData2Set类选择注册数据库的SCORE表。

在这里作点说明:CDATA2Set类由MFC自动添加,这与上篇文章中在Step2中选择Head files only是不同的,CrecordView 对象是一个视图,是数据库应用程序的用户界面,由它来完成用户与数据库的交互工作,CrecordView 视图对象是基于对话框模板资源来创建的,并由对话框模板中的控件来显示CrecordSet 对象的数据记录。

CrecordView 视图对象使用对话框数据交换机制(DDX)和记录字段交换机制(RFX)来实现表单控件和记录集字段之间的数据移动,并且自动为用户提供了记录集指针的移动(移向第一个记录、最后一个记录、下一个记录、上一个记录)和记录更新的操作。

最终选择和默认应如下图所示:2.打开RESOURCEVIEW在IDD_DATA2_FORM模板中加入编辑控制。

分别为三个编辑控件(IDC_EDIT_NUMBER,IDC_EDIT_NAME,IDC_EDIT_SCORE),三个按钮控件。

3.使用ClassWizard把编辑控制与记录集数据成员连接起来,注意加入变量时不需自己键入,只需在Member Viriable name的下拉列表中选择,最后结果应如下图所示:4.编译并测试应用程序,应该得到一个可工作的只有读操作的数据库应用程序5.加入菜单命令,为前面的三个按钮添加相应的成员函数。

分别为OnButtonAdd、OnButtonClear、OnButtonDelete6.在CData2View类中重载OnMove函数(先要在ClassWizard中映射该函数)BOOL CData2View::OnMove(UINT nIDMoveCommand){// TODO: Add your specialized code here and/or call the base classswitch (nIDMoveCommand){case ID_RECORD_PREV:m_pSet->MovePrev();if (!m_pSet->IsBOF())break;case ID_RECORD_FIRST:m_pSet->MoveFirst();break;case ID_RECORD_NEXT:m_pSet->MoveNext();if (!m_pSet->IsEOF())break;if (!m_pSet->CanScroll()) {// Clear out screen since we're sitting on EOFm_pSet->SetFieldNull(NULL);break;}case ID_RECORD_LAST:m_pSet->MoveLast();break;default:// unexpected case valueASSERT(FALSE);}// show results of move operationUpdateData(FALSE);return TRUE;// return CRecordView::OnMove(nIDMoveCommand);}7.编辑按钮控制函数,分别加入下列代码:void CData2View::OnButtonAdd(){// TODO: Add your control notification handler code here m_pSet->AddNew();UpdateData(TRUE);if (m_pSet->CanUpdate()) {m_pSet->Update();}if (!m_pSet->IsEOF()){m_pSet->MoveLast();}// m_pSet->Requery(); // for sorted setsUpdateData(FALSE);}void CData2View::OnButtonClear(){// TODO: Add your control notification handler code here m_pSet->SetFieldNull(NULL);UpdateData(FALSE);}void CData2View::OnButtonDelete(){// TODO: Add your control notification handler code hereCRecordsetStatus status;try {m_pSet->Delete();}catch(CDBException* e) {AfxMessageBox(e->m_strError);e->Delete();m_pSet->MoveFirst(); // lost our place!UpdateData(FALSE);return;}m_pSet->GetStatus(status);if (status.m_lCurrentRecord == 0) {// We deleted last of 2 recordsm_pSet->MoveFirst();}else {m_pSet->MoveNext();}UpdateData(FALSE);}8.再次编译并测试应用程序,现在可以加入、修改以及删除记录。