APP下载

基于ADO技术在城市轨道交通管理系统中的应用

2012-09-25孔繁虹

城市道桥与防洪 2012年3期
关键词:时刻表控件对话框

杨 柯,孔繁虹

(同济大学电气工程系,上海 201804)

0 引言

城市轨道交通管理系统,又称列车自动监控系统(ATS),它主要实现对列车运行的监督和控制,辅助行车调度人员对全线列车进行管理,对提高运输效率和保障行车安全起到极其重要的作用。它分为几大部分:车站设备信号控制,时刻表管理,车次号追踪,进路控制,列车运行图和列车运行调整(ATR)。其中列车时刻表是ATS系统中运营管理的基础,列车的车次号追踪需要从时刻表中查找车次;列车运行图的编制需要时刻表为基础;列车在运行过程中,依据时刻表来控制速度;在列车偏离时刻表运行的情况下,调度员还需要通过修正时刻表,来实现对列车的自动调整运行。所以本文主要介绍列车时刻表与数据库的通信技术。由于调度中心要与列车实时通信,并能及时地对列车收发指令,故对数据库接口要求提出了很高的要求。本文介绍MFC中的ADO技术,可迅速地操作数据库,并不需要安装驱动,简单方便,适合于大型调度服务器端的数据库中。

1 系统分析

1.1 系统功能分析

ATS的时刻表通常安装在控制中心的计算机上,由时刻表编辑员根据客流量和线路的状况来提供多套不同情况下使用的运行图,并存在ATS数据库中。该软件的主要功能描述如下:

(1)用户界面:可以看到列车车次号,时刻表,车站等信息。并能实时反映出当前列车的运行情况。

(2)数据库:ATS监控系统需要处理大量的数据,比如时刻表就分为计划时刻表和在线时刻表等,所以就要采取实时稳定可靠并能处理较大数据量的数据库,本文用SQL Server 2005作为数据存储工具,采用ADO技术,通过该接口用软件实现对数据库访问,可有效管理系统中数据。

1.2 系统目标

软件应该满足以下几个目标:

(1)列车调度员应该通过输入用户名和密码登录ATS调度系统。

(2)对车站的管理,可以增加,删除该线路上的车站信息。

(3)对列车的管理,实现加车,减车,修改列车时刻表等信息。

上面几个目标实现后,就可以根据数据库已有的时刻表来编制列车的计划运行图。

2 Visual C++中数据库访问技术

2.1 常用数据库访问技术

开放数据库互连(ODBC)是Microsoft引进的一种早期数据库接口技术,它用包含在DLL内的驱动程序完成任务。它提供了一组对数据库访问的标准API(应用程序编程接口),这些API利用SQL来完成其大部分任务。但其访问速度慢,并且需要安装驱动,且只能用于关系数据库,不适用于对象数据库。

DAO(数据访问对象)是微软第一个面向对象的数据库接口,它封装了Access的Jet函数,因此对Access的执行效率比较高,但对SQL等非MDB数据库得执行效率较低,因此不适用于列车监控系统。

OLE DB是微软的战略性的通向不同的数据源的低级应用程序接口。OLE DB不仅包括微软资助的标准数据接口开放数据库连通性(ODBC)的结构化问题语言(SQL)能力,还具有面向其他非SQL数据类型的通路。它的对象包括数据源对象、阶段对象、命令对象和行组对象。但它使用时需加入很多代码,使用起来比较复杂。

2.2 ADO技术

微软的ADO(ActiveX Data Objects)是一个用于存取数据源的COM组件。它提供了编程语言和统一数据访问方式OLE DB的一个中间层。允许开发人员编写访问数据的代码而不用关心数据库是如何实现的,而只用关心到数据库的连接。它是使用简单,读写速度快,又更加灵活的对象模型。适合用在城市轨道交通数据库中。

ADO主要数据对象

Connection对象

-Connection对象用于建立与数据库的连接。通过连接可从应用程序访问数据源。它保存诸如指针类型、连接字符串、查询超时、连接超时和缺省数据库这样的连接信息。Command对象

-Command对象定义了将对数据源执行的指定命令。Command对象可以在数据库中添加、删除或更新数据、或者在表中进行数据查询。返回的结果保存在Recordset对象中。Recordset对象

-Recordset对象表示的是来自基本表或命令执行结果的记录全集。任何时候,Recordset对象所指的当前记录均为集合内的单个记录。使用ADO时,通过Recordset对象可对几乎所有数据进行操作。所有Recordset对象均使用记录(行)和字段(列)进行构造。在一个Connection对象上,可以同时打开多个Recordset。

3 程序的实现

3.1 ADO类的实现

由于数据库是存放在SQL 2005中,需要先在SQL中建立数据库train,然后向里面添加多个表,分别存放车站信息,列车时刻表信息和用户信息等。如图1所示,是列车时刻表信息的结构,设置列车ID为主键,不能为空。

在VC2005中建立一个基于对话框的MFC应用程序time,并添加相关菜单,如车站信息管理,时刻表添加、删除、修改,退出系统等。不同的菜单命令都有一个对话框与之对应,然后向个对话框中添加静态控件、编辑控件、TAB控件、按钮控件和列表框控件等。为了使表中的字段与编辑控件对应,编辑控件应与控制变量绑定。下面介绍ADO技术的在VC中的应用。

(1)为了便于方便的使用ADO,该程序中对ADO封装到了一个类中,命名为ADOConn,后面的编程可直接调用该类使用ADO,避免重复写代码。在使用ADO之前,应在该类的头文件中加入以下代码:

#import"C:Program FilesCommon FilesSystemadomsado15.dll"no_namespacerename("EOF","adoEOF")rename("BOF","adoBOF")

此指令,告诉编译器把指令的动态库文件引入到程序中去,为了避免与其他地方定义的EOF冲突,使用rename指令将EOF重新命名。

(2)在头文件定义几个函数,如 void OnInit ADOConn()用来初始化连接数据库,_RecordsetPtr&GetRecordSet(_bstr_t bstrSQL)来执行查询,BOOL ExecuteSQL(_bstr_t bstrSQL)来执行SQL语句。

(3)在调用ADO时候需要初始化OLE/COM环境,在OnInitADOCon中用::CoInitialize(NULL)来实现,在最后关闭记录集连接时还要用::CoUninitialize()来释放环境。另外为了能捕捉到程序的错误信息,还需要捕捉异常,具体代码是:

catch(_com_error e)

{

AfxMessageBox(e.Description());}

(4)创建Connection对象,并设置字符串与数据库连接,如本例代码为:

_bstr_tstrConnect="Provider=SQLOLEDB.1;

DataSource=WWW;UserID=sa;Password=sa;Initial Catalog=train";

其中,DataSource为计算机名,对本机可直接用 127.0.0.1代替;User ID和 Password分别是SQL的登录名和密码,Initial Catalog是数据库名称。

(5)创建记录集对象m_pRecordset.CreateInstance(__uuidof(Recordset)),然后取得表中的记录,代码

图1 Time数据表结构

如下:

m_pRecordset →Open (bstrSQL,m_pConnection.GetInterfacePtr (),adOpenDynamic,adLockOptimistic,adCmdText);

(6)执行SQL命令,connection对象的Execute方法是:

(_bstr_t CommandText,VARIANT*RecordsAffected,long Options)

m_pConnection->Execute(bstrSQL,NULL,adCmdText)

其中,CommandText是命令字符串,通常是SQL命令,RecordsAffected是操作完成后所影响的行 数 ,Options表 示 CommandText的 类 型,adCmdText文本令,adCmdTable表名,adCmdProc是存储过程,adCmdUnknown-未知。

3.2 程序的实现

ATS系统的数据库管理是整个列车行车调度的关键,其车次号的变更,加减列车,时刻表偏移等措施无一不与数据库有很大关系。下面介绍程序的实现步骤:

(1)先对数据库中的每个表创建一个类,如时刻表创建类CShike,并把一些相关的SQL命令如insert、update、delete命令封装在类中,方便后面直接调用。

(2)新建一个对话框Dialogin,添加编辑框等控件来输入用户名密码,并对编辑框添加变量与表对应。之后再主对话框的OnInitDialog函数中加入以下代码:CDialogin gin;

if(gin.DoModal()!=IDOK)

OnOK();

这样程序运行时就会先出现登陆框,输入用户名密码后方能进入主界面(见图2)。

图2 程序主界面

状态栏中mr就是当前登陆的用户名。

(3)以时刻表管理为例,新建对话框并插入相关控件,这里为了方便维护信息和查询,用了TAB控件分页,单击TAB的时刻信息按钮显示列表框并直接从数据库表中读取时刻表信息并显示。单击信息删除按钮显示编辑框等控件,调度员可以在这里对时刻表的相关信息进行维护,比如添加、修改、删除等。下面就相关代码做介绍。

在CShikedlg的OnInitDialog函数中加入以下代码实现TAB按钮名称:

TC_ITEM tci;

tci.mask=TCIF_TEXT;

tci.pszText="时刻信息";m_tab.InsertItem(0,&tci);tci.pszText="信息删除";m_tab.InsertItem(1,&tci)。

之后InsertColumn初始化列表框控件,之后调用ADO类并执行SQL命令,再向列表框控件插入数据,比如表中字段为trainID,代码就是:

m.list.SetItemText(0,0,(char*)(_bstr_t)m_AdoConn.m_pRecordset->GetCollect("TrainID")); 其中 m_list是列表框的成员变量。

TAB的分页机制可用OnTcnSelchangeTab1和OnTcnSelchangingTab1与SetCurTab函数来实现,比如编辑框和列表框的代码如下:

void CShikedlg::SetCurTab(UINT m_index){

m_tab.SetCurSel(m_index);

if(m_index==0)

{

GetDlgItem(IDC_LIST1)->ShowWindow(SW_HIDE);GetDlgItem(IDC_EDIT1)->ShowWindow(SW_SHOW);}

else{

GetDlgItem(IDC_EDIT1)->ShowWindow(SW_HIDE);GetDlgItem(IDC_LIST1)->ShowWindow(SW_SHOW);

}}

程序运行后的时刻表信息如图3所示。

4 小结与展望

通过程序的运行结果可知,ADO可以快速实现对数据库的操作,整个过程不需要安装任何驱动,在VC中直接使用ADO代码即可实现,简单方便。本文使用MFC开发程序,其强大的集成环境可简化加快应用程序的开发,采用ADO技术实现数据库管理之后,就可以利用已有的数据来绘制列车的计划运行图,MFC提供的绘图类CDC非常方便,利用函数move to,line to结合相关算法可直接绘制出运行图;从而更好地实现ATS的行车调度。

[1]宋坤,李伟明,刘锐宁.Visual C++数据库系统开发案例精选[M].北京:人民邮电出版社,2006:311-360.

[2]颜志军.Visual C++数据库通用模块及典型系统开发实例[M].北京:电子工业出版,2006:17-134.

[3]赵丽红,刘海,王春晓.基于MFC和ADO技术的电网数据库系统[J].测控技术,2010,29(8).

[4]刘晓娟,张雁鹏,汤自安.城市轨道交通智能控制系统[M].北京:中国铁道出版社,2008:105-118.

[5]SERBANGHENEA,Application Tool for Experiments on SQLServer 2005 Transactions[J].WSEASTransactions on Computers,2007,6(2).

图3 程序运行后的时刻表信息

猜你喜欢

时刻表控件对话框
城市轨道交通时刻表调整服务器故障分析及探讨
正常恢复虚拟机
令你误车的列车时刻表
Bootlace Worms’Secret etc.
What Is Beauty?
关于.net控件数组的探讨
城市轨道交通ATS系统的时刻表同步机制研究
浅谈VB的通用对话框《CommonDialog》控件的使用
ASP.NET服务器端验证控件的使用
短文改错