gVC中ODBC数据库技术应用源程序详解串口数据保存相关.docx
《gVC中ODBC数据库技术应用源程序详解串口数据保存相关.docx》由会员分享,可在线阅读,更多相关《gVC中ODBC数据库技术应用源程序详解串口数据保存相关.docx(10页珍藏版)》请在冰豆网上搜索。
![gVC中ODBC数据库技术应用源程序详解串口数据保存相关.docx](https://file1.bdocx.com/fileroot1/2022-11/24/bd652a76-9759-472e-b49b-a132313b70f7/bd652a76-9759-472e-b49b-a132313b70f71.gif)
gVC中ODBC数据库技术应用源程序详解串口数据保存相关
VC中ODBC数据库技术应用源程序详解(串口数据保存相关)
摘要:
本文通过实例详细介绍了VC中ODBC数据库技术的编程应用,数据库源为ACCESS。
本文源程序下载
database1.zip47KBVC6.0Win9X/2000
我们在编程时要保存各种实时接收的数据,并为以后的数据再现回放,就应该建立数据文件,而这种数据文件可以用普通文件读写方式,但当数据类型较多且要求随时回放数据时,要求编程时设置较大的动态数组,这会占用较多的系统资源,甚至导致程序崩溃;而利用数据库则可以较好地解决这个问题,我们将数据放到数据源文件中,通过编程接口对其进行访问。
ODBC(开放的数据库连接:
OpenDatabaseConnectivity)为各种类型的数据库管理系统提供了统一的编程接口,我们在下面的几篇文章中,首先通过实例说明ODBC技术的应用方法,然后说明如何将串口数据实时保存在数据源文件中,这一方面介绍VC中ODBC技术的应用(前面的例子不涉及串口技术,以方便只想了解ODBC技术的读者,又为利用ODBC技术保存串口编程数据提供范例,虽然前面几个例程与串口通讯不相关,但如果对使用数据库不熟悉,也请从前面有耐心地看下去。
1.首先在控制面板中,打开ODBC数据源,点击用户DSN选项,在出现的界面中点击添加,如下图所示:
然后,点击完成按钮,出现下图,填入数据源名(可随意取名,本处设为biao)
点击确定即可。
2.在ACCESS中创建数据库,本例中为data(只包含number,name,score三列),可从我提供的这个例子下COPY
3.建立应用程序项目
(1)打开File菜单的New选项,选取Projects,
选择MFCAppWizard(exe),填入工程名,本例为DATA1
(2)把数据库文件data拷入新建的工程目录。
(3)应用程序的类型指定为SDI,在Step2对话框中选择HeaderFilesOnly选项,在Step6是将视图基类指定为CScrollView。
(4)用ClassWizard创建记录集类。
从AddClass菜单中选择New,并按下图填充对话框:
(说明:
一个CRecordset对象代表从数据源中查询的一个记录集。
)
(5).点击OK,进入DataSource,选择biao数据源,并选择Dynast选项,如下图所示:
在选择了数据源之后,ClassWizard提示我们选择一个表。
如下图所示:
(6)在ClassWizard中,针对新产生的CDataSet类,单击MemberVariables标签。
此时ClassWizard应按照数据库列的名称产生了如下的数据成员:
(7)在CData1View类中添加数据成员
(8)在Cdata1Doc中添加如下成员:
(9)编辑DATA1View.cpp中的OnDraw()和OnInitialUpdate()函数:
voidCDATA1View:
:
OnDraw(CDC*pDC)
{
CDATA1Doc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
//TODO:
adddrawcodefornativedatahere
TEXTMETRICtm;
pDC->GetTextMetrics(&tm);
intnLineHeight=tm.tmHeight+tm.tmExternalLeading;
CPointpText(0,0);
inty=0;
CStringstr;
if(m_pSet->IsBOF()){//detectsemptyrecordset
return;
}
m_pSet->MoveFirst();//failsifrecordsetisempty
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;
}
}
voidCDATA1View:
:
OnInitialUpdate()
{
CScrollView:
:
OnInitialUpdate();
CSizesizeTotal(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)编译结果应如下所示:
请继续看一篇如何在在数据库中动态修改数据库记录。
摘要:
本文先按一般方法详述如何动态在数据库中添加、删除记录,然后说明如何将串口实时接收的数据加入数据库中。
数据库源为ACCESS。
本文源程序下载
database2.zip51KBVC6.0Win9X/2000
首先,按上一篇文章步骤一二,分别安装注册数据源及创建数据库。
然后开始以下的步骤:
1.建立一个基于单文档的应用程序。
生成新的工程名,本例为data2,在Step1中选择SDI,Step2中选择DatabaseViewWithoutFileSupport,同时在Step2对话框中,单击DataSource按钮,与上一篇文章一样,为CData2Set类选择注册数据库的SCORE表。
在这里作点说明:
CDATA2Set类由MFC自动添加,这与上篇文章中在Step2中选择Headfilesonly是不同的,CrecordView对象是一个视图,是数据库应用程序的用户界面,由它来完成用户与数据库的交互工作,CrecordView视图对象是基于对话框模板资源来创建的,并由对话框模板中的控件来显示CrecordSet对象的数据记录。
CrecordView视图对象使用对话框数据交换机制(DDX)和记录字段交换机制(RFX)来实现表单控件和记录集字段之间的数据移动,并且自动为用户提供了记录集指针的移动(移向第一个记录、最后一个记录、下一个记录、上一个记录)和记录更新的操作。
最终选择和默认应如下图所示:
2.打开RESOURCEVIEW在IDD_DATA2_FORM模板中加入编辑控制。
分别为三个编辑控件(IDC_EDIT_NUMBER,IDC_EDIT_NAME,IDC_EDIT_SCORE),三个按钮控件。
3.使用ClassWizard把编辑控制与记录集数据成员连接起来,注意加入变量时不需自己键入,只需在MemberViriablename的下拉列表中选择,最后结果应如下图所示:
4.编译并测试应用程序,应该得到一个可工作的只有读操作的数据库应用程序
5.加入菜单命令,为前面的三个按钮添加相应的成员函数。
分别为OnButtonAdd、OnButtonClear、OnButtonDelete
6.在CData2View类中重载OnMove函数(先要在ClassWizard中映射该函数)
BOOLCData2View:
:
OnMove(UINTnIDMoveCommand)
{
//TODO:
Addyourspecializedcodehereand/orcallthebaseclass
switch(nIDMoveCommand)
{
caseID_RECORD_PREV:
m_pSet->MovePrev();
if(!
m_pSet->IsBOF())
break;
caseID_RECORD_FIRST:
m_pSet->MoveFirst();
break;
caseID_RECORD_NEXT:
m_pSet->MoveNext();
if(!
m_pSet->IsEOF())
break;
if(!
m_pSet->CanScroll()){
//Clearoutscreensincewe'resittingonEOF
m_pSet->SetFieldNull(NULL);
break;
}
caseID_RECORD_LAST:
m_pSet->MoveLast();
break;
default:
//unexpectedcasevalue
ASSERT(FALSE);
}
//showresultsofmoveoperation
UpdateData(FALSE);
returnTRUE;
//returnCRecordView:
:
OnMove(nIDMoveCommand);
}
7.编辑按钮控制函数,分别加入下列代码:
voidCData2View:
:
OnButtonAdd()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
m_pSet->AddNew();
UpdateData(TRUE);
if(m_pSet->CanUpdate()){
m_pSet->Update();
}
if(!
m_pSet->IsEOF())
{
m_pSet->MoveLast();
}
//m_pSet->Requery();//forsortedsets
UpdateData(FALSE);
}
voidCData2View:
:
OnButtonClear()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
m_pSet->SetFieldNull(NULL);
UpdateData(FALSE);
}
voidCData2View:
:
OnButtonDelete()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
CRecordsetStatusstatus;
try{
m_pSet->Delete();
}
catch(CDBException*e){
AfxMessageBox(e->m_strError);
e->Delete();
m_pSet->MoveFirst();//lostourplace!
UpdateData(FALSE);
return;
}
m_pSet->GetStatus(status);
if(status.m_lCurrentRecord==0){
//Wedeletedlastof2records
m_pSet->MoveFirst();
}
else{
m_pSet->MoveNext();
}
UpdateData(FALSE);
}
8.再次编译并测试应用程序,现在可以加入、修改以及删除记录。
打开ACCESS数据库,可以看到文件已作为相应的改动。
9.最后,我们来看看如何与串口数据关联起来,方法应该是在串口的接收事件驱动函数OnCommunication()中将串口接收数据送到数据库的成员保存,相当于在OnCommunication()函数中调用OnButtonAdd()函数,具体方法我们将在下一篇关于CserialPort类的应用中详细说明。