VC中ODBC数据库技术应用源程序详解之二(串口数据保存相关)

来源:互联网 发布:匈牙利算法 编辑:程序博客网 时间:2024/04/29 06:40

首先,按上一篇文章步骤一二,分别安装注册数据源及创建数据库。
然后开始以下的步骤:
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、OnButtonDelete


6. 在CData2View类中重载OnMove函数(先要在ClassWizard中映射该函数)
BOOL CData2View::OnMove(UINT nIDMoveCommand) 
{
// TODO: Add your specialized code here and/or call the base class
switch (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 EOF
m_pSet->SetFieldNull(NULL);
break;
}

case ID_RECORD_LAST:
m_pSet->MoveLast();
break;

default:
// unexpected case value
ASSERT(FALSE);
}

// show results of move operation
UpdateData(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 sets
UpdateData(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 here
CRecordsetStatus 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 records
m_pSet->MoveFirst();
}
else {
m_pSet->MoveNext();
}
UpdateData(FALSE);
}


8. 再次编译并测试应用程序,现在可以加入、修改以及删除记录。打开ACCESS数据库,可以看到文件已作为相应的改动。


9. 最后,我们来看看如何与串口数据关联起来,方法应该是在串口的接收事件驱动函数OnCommunication()中将串口接收数据送到数据库的成员保存,相当于在OnCommunication()函数中调用OnButtonAdd()函数,具体方法我们将在下一篇关于CserialPort类的应用中详细说明。