摘 要
随着经济的日益增长,信息化时代已经到来,生活中各种信息趋向数字化、清晰化。公交车作为现代城市生活中一种重要的交通工具,其数量增多,车型也不再单一,雇用的司机增多,这样使得公交车公司的车辆信息管理复杂化。在这样的背景下,提出了计算机管理的公交车管理系统,辅助公交车运营公司对车辆进行管理,实现公交车、公交线路和司机管理科学化,更合理的利用资源。
该系统主要根据实际的需求,以需求分析、系统的设计目标,并且重点进行系统功能模块的详细设计和实现,采用了Visual Studio .NET 2003开发平台和 SQL Server 2000数据库,实现了车辆信息管理、司机信息管理、线路信息管理和车辆分配线路管理等功能。在针对数据操作方面,主要通过存储过程的方式实现数据的添加、删除和查询等操作。通过系统测试,解决了公交车辆管理系统主要问题。
关键词: 管理系统;数据库;存储过程
1. 编程环境的选择
微软公司的Visual Studio .NET 2003是Windows应用程序开发平台,该平台具有直观的开发界面、先进的程序设计思想,是目前最为广泛的、易学易用的面向对象的开发工具。VS.NET 2003提供了大量的控件,这些控件可用于设计界面和实现各种功能,减少了编程人员的工作量,也简化了界面设计过程,从而有效的提高了应用程序的运行效率和可靠性。C#同时提供的一套完善的编译和调试系统,使得在开发过程中可以很好的解决开发过程中出现的一系列问题。同时在该平台下还提供了软件发布功能,使得开发、调试到发布可以一步完成。故而,这是实现该信息管理信息的一个较好选择。
2. 关系型数据库
SQL Server 2000是一种功能强大的数据库开发工具,数据库汇集了信息以供查询、存储和检索。它的优点在于强大的数据库引擎,它可以承受10000条以上的记录测试,而且数据库运行于服务器上,相对于本地数据库,可以明显的减少内存占用,提高运行速度和本机的利用效率。SQL数据库具有友好的管理界面——企业管理器,其中的视图可以直观的进行数据处理,同时支持直观的数据库设计,也可以通过词法分析器,使用SQL语句进行数据库的各种操作,包括数据库的建立,表的建立和修改等一系列操作。采用C/S模式的设计,可以更加合理的利用企业资源,使得数据集中在一台服务器上,从来节省了数据库管理的人力资源,也使得由于非专业人士的误操作,或者别的各种电脑意外而导致数据丢失,或者别的不必要损失,所以在数据库选择上采用了SQL Server 2000。
3. ADO.NET综述
ADO.NET是ADO的改进版本。ADO.NET是与C#和.NET Framework一起使用的类集的名称,用于以关系型的、面向表的格式访问数据[1]。ADO.NET集成到.NET Framework中,可以用于任何.NET语言,尤其是C#。这也是该管理系统采用C#程序语言的原因。
ADO.NET的作用与ADO(Active Data Objects)相同,提供易于使用的类集,以访问数据,ADO.NET的功能得到更新和增强,可以用于.NET编程环境。在使用SQL Server数据库时,通过SQL Server专用的内置.NET数据提供者可以获得最好的性能和对基础功能的最直接的访问。
4. 逻辑设计
根据针对系统的需求分析,可以得到本系统对应的各实体以及实体之间的关系。其中包含有用户实体、司机实体、车辆实体、线路信息实体等。下面根据分析得出其中主要的E-R图,如图2和图3所示。
图2 司机实体与车辆实体E-R图
图3 车辆和线路E-R图
5.1 登录模块
1.用户身份验证
输入:用户名和密码。
处理:
(1)用户登录窗体启动。
(2)输入用户名和密码。
(3)检索数据库中数据,是否有相应的用户名和密码。
(4)如果用户名和密码为空,或者错误,进行提示。
(5)如果输入的用户名和密码正确,则允许该用户进入系统。
(6)进入主控制台。
输出:主控制台。
2.用户登录模块的窗体设计
用户登录模块的窗体设计,如图4所示。
3.用户登录模块的主要代码
private void button1_Click(object sender, System.EventArgs e)
{
DataAccess myAcc=new DataAccess();
if(myAcc.userlogin(this.textBox1.Text.Trim(),
this.textBox2.Text.Trim())==1) {
this.Visible=false;
Main newMain=new Main(this.textBox1.Text.Trim());
newMain.Show();
}
else if(myAcc.userlogin(this.textBox1.Text.Trim(),"") == 0)
MessageBox.Show("没有该用户!");
else
{
MessageBox.Show("登录失败");
}
}
private void button1_Click()鼠标事件用于实现在输入用户名和密码后,进入系统主控制界面的方法。DataAccess类是自定义的用于实现数据库访问的类。该方法中判断语句里调用了该类所声明的对象myAcc的方法userlogin(),该方法的具体实现代码如下所示:
public int userlogin(string username,string userpass)
{
Database myDB=new Database();
SqlParameter[] para={
myDB.MakeInParam("@username",SqlDbType.NVarChar,50,username),
myDB.MakeInParam("@userPass",SqlDbType.NVarChar,50,userpass)
};
return myDB.RunProc("spr_uerlogin",para);
}
该段代码展示了上文中所提到的存储过程的具体使用。
5.2 主操作界面模块
1.主控制平台的窗体设计
主控制平台的窗体设计,如图5所示。
从界面上直观的向用户表明了在该系统下可以进行的一系列操作,包括新用户的注册,车辆信息的管理,司机信息的管理,线路信息的管理和车辆线路分配的管理。当用户选择相应的功能进行操作时,触发该按钮事件,则可以进入相应的功能界面进行相应的操作。
5.3 系统用户注册模块
1.添加用户子模块
添加用户子模块负责系统的安全性,在该模块种只能增加新用户而不能修改、删除用户,这样是为了加强系统的安全性,保证了系统的恶意操作或误删除等情况出现。
(1)添加新用户功能的实现,并且设置用户的初始密码。
(2)功能模块实现的界面效果如图6所示。
2.该子模块功能主要代码
//用户名检测机制,保证用户名的唯一性。
private void button2_Click(object sender, System.EventArgs e)
{
if(this.textBox1.Text.Trim()=="") {
MessageBox.Show("用户名不能为空");
}
else if(checkuser()==1)
MessageBox.Show("该用户名不存在,可以注册!");
else {
MessageBox.Show("该用户名存在,请重新录入新的用户名!");
}
}
将新用户的信息写入数据库。通过自定义对象myAccc访问数据库,主要是由该对象调用存储过程来实现。
private void button1_Click(object sender, System.EventArgs e)
{
//checkuser()是自定义的方法,实现对用户名的检查判断。
if(checkuser()==0) {
MessageBox.Show("该用户名存在,请重新录入新的用户名!");
return ;
}
自定义的regcheck()方法,根据该方法返回的值对不同的情况进行处理。
if(regcheck()==1) {
DataAccess myAcc=new DataAccess();
int li_check=myAcc.uerReg(this.textBox1.Text.Trim(),
this.textBox2.Text.Trim(),
this.comboBox1.SelectedItem.ToString(),
this.textBox4.Text.Trim(),
this.textBox5.Text.Trim()
);
if(li_check==1) {
MessageBox.Show("注册成功");
}
}
}
5.4 车辆信息管理模块
1.车辆信息模块
该模块实现对车辆信息如、车牌号、颜色、座位数、是否无人售票和车辆品牌信息的录入和删除操作。该界面窗体效果如图7所示。
2.该功能模块实现的主要代码
该段代码在用户点击“所有”按时,触发一个事件,通过调用allcarinfo()方法来返回数据库中的数据, 然后使用dataGrid控件将数据显示出来。
private void button2_Click(object sender, System.EventArgs e)
{
DataAccess myAcc = new DataAccess();
DataSet mySet = new DataSet();
mySet=myAcc.allcarinfo();
this.dataGrid1.DataSource = mySet.Tables[0];
}
该段代码实现用户增加车辆信息后完成保存功能的实现。其中针对某些可能出错的地方做出了人性化的处理,以便用户更正和做出相应的处理。
5.5 司机信息管理模块
1.司机信息管理模块
通过该窗体,输入司机姓名、身份证、编号和驾驶编号等等司机的个人资料,实现添加司机信息的功能,该功能模块窗体的效果如图8所示。
2.实现该功能模块的主要代码
该事件实现将合法的司机信息写入数据库。同样通过自定义类的对象来访问数据库,并通过调用存储过程实现完成操作。
private void button1_Click(object sender, System.EventArgs e)
{
if(AddDirverscheck()==1) {
DataAccess myAcc=new DataAccess();
int li_check=
myAcc.AddDirvers(this.tb_name.Text.Trim(), this.tb_Number.Text.Trim(),
this.lab_photo.Text.Trim(), this.tb_Idnumber.Text.Trim(),
this.tb_phone.Text.Trim(), this.tb_address.Text.Trim(), his.tb_DirverNumber.Text.Trim() );
if(li_check==1) {
string ls_D=System.Environment.CurrentDirectory;
MessageBox.Show("操作成功");
int li_counts=this.Controls.Count;
for(int i=0;i<li_counts;i++) {
if(this.Controls[i].GetType().ToString()=="System.Windows.Forms.TextBox") this.Controls[i].Text=""; }
}
}
}
5.6 线路信息管理模块
1.在该功能模块中实现添加线路相关的信息,主要输入的信息包括线路编号、线路名称、发车时间和收车时间等,具体的窗体效果见下页图9所示。
2.实现该功能的主要代码
CheckReg()是一个用于实现检查用户注册信息的私有方法,该方法通过嵌入SQL语句来检索数据库信息,以核对用户信息的有效性。
private int CheckReg()
{
DataSet mySet=new DataSet();
string ls_query= "select * from t_lineInfo where LineName='"+ this.tb_name.Text.Trim()+"' or LineCode='"+ this.tb_Code.Text.Trim()+"'";
Database myDB=new Database();
mySet=myDB.SQLQuery(ls_query);
if(mySet.Tables[0].DefaultView.Count==0) return 0;
else
return 1;
}
5.7 车辆分配线路管理模块
1.车辆分配线路管理功能
公交车最终要与固定的某条线路相匹配,把具体的每一辆车分配到设置好的线路上。这样,汽车,司机,线路才能完成有机的联系,形成一个整体。对于管理者来说,能够通过该系统所提供的功能从宏观上把握车辆的运行情况,如图10所示。
2.实现功能的主要代码
鼠标单击“确定”事件时,将进行的操作。首先根据整型变量li_LineID和li_CarID的值来判断是否选择了车辆或者某条线路;若没有,则弹出一消息窗口,给出提示信息。
private void button1_Click(object sender, System.EventArgs e)
{
if(li_LineID==0 || li_CarID==0 ){
MessageBox.Show("车辆或者线路没有选择,请选择!");
return;
}
DataAccess myAcc=new DataAccess();
if(myAcc.CheckLinByCarID(li_CarID)==0){
MessageBox.Show("该汽车已经分配线路");
}
else{
int li_flag=0;
if(this.checkBox1.Checked==true)
li_flag=1;
else
li_flag=0;
if(myAcc.InsertCarLine(li_CarID,li_LineID,li_flag)>0)
MessageBox.Show("保存成功!");
}
}