从2012年7月20——2012年10月31日经历了历时三个月的.NET机房收费系统开发。下面我从文档、UML图,代码这三个方面来进行总结。
一、文档
1.1可行性分析报告和项目开发计划
这两个文档主要是确定软件系统是否值得开发,搞清楚问题的性质,确定系统的目标和规模,从技术,经济和社会等方面分析论证项目的可行性。还有对此项目的开发做个总体的规划,内容有:项目的背景,项目概述,计划,人员及组织分工,交付期限。为软件的开发进行详细的计划。
可行性分析报告和项目开发计划是给开发单位看的。
1.2需求分析。
是用户对项目软件系统在功能、行为、性能设计约束方面的期望。软件对软硬件的需求。需求分析是用户、分析人员和系统设计人员共同参与讨论编写,是为系统设计提出“做什么”
1.3概要设计和详细设计
1.3.1概要设计
概要设计将系统划分成模块结构形式,决定每个模块要完成的功能,每个模块之间的调用关系。概要设计主要包含:功能、处理流程、数据结构、运行等做设计。概要设计是高级设计人员和有丰富经验的开发人员一起编写。
1.3.2 详细设计
描述模块执行过程、局部数据组织、控制流和每一步具体家用要求及实现设计。为编程人员提供每一个功能的数据输入,输出、设计方法、流程逻辑、接口、存储分配、注释设计、测试计划。此文档是由每一个程序人员参与编写。
编写完一遍文档发现,写一遍文档相当于对整个系统编写了一遍。
二、UML图
1、用例图
定义:采用参与者与用例作为基本元素,以不同的视角展现系统的功能型需求。在需求分析的时候要画用例图。
2、类图
定义描述现实世界中问题的概念理解,类之间的关系有依赖、关联、继承,多态。每个类里面有方法和属性,方法要写参数和返回值。
3、包图
包图是在 UML 中用类似于文件夹的符号表示的模型元素的组合。系统中的每个元素都只能为一个包所有,一个包可嵌套在另一个包中。使用包图可以将相关元素归入一个系统。
4、时序图。
这个显现了各个类之间各个层之间的逻辑关系。
5、部署图。
显现了系统编码打包交付给用户之后的部署。
6、状态图。描述一个实体基于事件反应的动态行为,显示了该实体如何根据当前所处的状态对不同的事件做出反应的。
状态图资料:http://www.doc88.com/p-048673468042.html
7、行为图。和状态图差不多
8、构件图。构件图从软件架构的角度来描述一个系统的主要功能,如系统分成几个子系统,每个子系统包括哪些类、包和构件,它们之间的关系以及它们分配到哪些节点上等。使用构件图可以清楚地看出系统的结构和功能。方便项目组的成员制定工作目标和了解工作情况,同时,最重要的一点是有利于软件的复用。
三、代码
开始编写代码的时候,一开始很迷茫,看了好多人的博客但是还是看不懂代码,也敲了几个三层的例子因为DAL层的代码有困难看不懂。困难了几天之后终于有一天问了柳松学姐一下关于代码的问题懂了。这个时候我就开始继续编写代码。说实话最难写的是DAL层,BLL层UI层很简单就是把得到的参数传到BLL中BLL在通过一些逻辑判断,把想要查的数据赋给实体类然后传到DAL层让DAL层来进行数据库的操作。下面我就写下在.NET机房收费系统开发中学习到的一些只是。
1、数据库连接。
要想数据库的操作就要连接数据库,连接数据库有很多中方法,一开始我用了最简单的直接每个DAL层的类中写上
Dim con As String="server=192.168.24.160;database=Charge_System;uid=sa;pwd=123456;" Dim conn As sqlConnection = New sqlConnection(con)
柳松学姐看了以后叫我提取出来因为DAL层的每一个类都要写这个如果服务器改了得改很多地方所以我建立了一个LinkData类创建了一个方法。这样每一次调用一下就行了。代码如下:
Imports System.Data.sqlClient Imports System.Configuration Public Class LinkData ''' <summary> ''' 连接数据库 ''' </summary> ''' <returns></returns> ''' <remarks></remarks> Shared Function Link() As sqlConnection Dim con As String="server=192.168.24.160;database=Charge_System;uid=sa;pwd=123456;" Dim conn As sqlConnection = New sqlConnection(con) Return conn End Function End Class
然后在DAL的每一类中调用一下就行了。
到了验收的时候学姐说应该把这个放在配置文件里面不要写死了然后我就去改去了打开app.config文件。然后编码:
<configuration> <appSettings> <add key="connStr" value="server=192.168.24.160;database=Charge_System;uid=sa;pwd=123456;"/> </appSettings> <system.diagnostics>DAL层中LinkData类中改下代码为: Public Class LinkData ''' <summary> ''' 连接数据库 ''' </summary> ''' <returns></returns> ''' <remarks></remarks> Shared Function Link() As sqlConnection Dim con As String con = System.Configuration.ConfigurationManager.AppSettings("connStr") Dim conn As sqlConnection = New sqlConnection(con) Return conn End Function End Class
就这样在重新打包生成文件这样生成的打包文件只要更改一下app.config文件中的“add key="connStr" value=”value后面的那句话就可以连接新的数据库了。这样的话对数据库的部署增加了灵活性。
2、sqlClient类
sqlConnection类:表示sql server数据源的一个连接。或者表示sql server数据源的一个唯一的会话。
sqlCommand类:表示要对 sql Server 数据库执行的一个 Transact-sql 语句或存储过程。
sqlParamater类:表示sqlCommand的参数,也可以是它到DataSet列的映射。
三、增、删、改。
这方面没什么好说的贴上代码吧
增加记录:
''' <summary> ''' 添加在线记录 ''' </summary> ''' <param name="OnLineInfo"></param> ''' <returns></returns> ''' <remarks></remarks> Function AddOnLineInfo(ByVal OnLineInfo As Entity.OnComputerInfo) As Entity.OnComputerInfo Dim strsql As String = "insert into OnComputer_Info values(@StudentCardNumber,@StudentNumber,@StudentName,@StudentMajor,@StudentSex,@OnLineDate,@OnLineTime,@OperatorUseComputer)" Dim cmd As sqlCommand = New sqlCommand(strsql,conn) '传参数 cmd.Parameters.Add(New sqlParameter("@StudentCardNumber",OnLineInfo.StudentCardNumber)) cmd.Parameters.Add(New sqlParameter("@StudentNumber",OnLineInfo.StudentNumber)) cmd.Parameters.Add(New sqlParameter("@StudentName",OnLineInfo.StudentName)) cmd.Parameters.Add(New sqlParameter("@StudentMajor",OnLineInfo.StudentMajor)) cmd.Parameters.Add(New sqlParameter("@StudentSex",OnLineInfo.StudentSex)) cmd.Parameters.Add(New sqlParameter("@OnLineDate",OnLineInfo.OnLineDate)) cmd.Parameters.Add(New sqlParameter("@OnLineTime",OnLineInfo.OnLineTime)) cmd.Parameters.Add(New sqlParameter("@OperatorUseComputer",OnLineInfo.OperatorUserComputer)) Try conn.Open() If (cmd.ExecuteNonQuery > 0) Then OnLineInfo.Success = True Else OnLineInfo.Success = False End If Return OnLineInfo Catch ex As Exception OnLineInfo.Success = False Return OnLineInfo Finally cmd.Dispose() conn.Close() End Try End Function
删除记录:
''' <summary> ''' 删除上机记录 ''' </summary> ''' <param name="OnLineInfo"></param> ''' <returns></returns> ''' <remarks></remarks> Function DeleteOnLineInfo(ByVal OnLineInfo As Entity.OnComputerInfo) As Entity.OnComputerInfo '删除记录的语句 Dim strsql As String = "delete from OnComputer_Info where StudentCardNumber=@StudentCardNumber" Dim cmd As sqlCommand = New sqlCommand(strsql,conn) cmd.Parameters.Add(New sqlParameter("StudentCardNumber",OnLineInfo.StudentCardNumber)) Try conn.Open() If (cmd.ExecuteNonQuery > 0) Then OnLineInfo.Success = True Else OnLineInfo.Success = False End If Catch ex As Exception OnLineInfo.Success = False Finally cmd.Dispose() conn.Close() End Try Return OnLineInfo End Function
更改记录:
''' <summary> ''' 更新工作记录 ''' </summary> ''' <param name="WorkLogInfo"></param> ''' <returns></returns> ''' <remarks></remarks> Function UpdateWorkLogInfo(ByVal WorkLogInfo As Entity.WorkLogInfo) As Entity.WorkLogInfo Dim strsql As String = "update WorkLog_Info set logoutDate =@logoutDate,logoutTime =@logoutTime,OperatorStatus =@OperatorStatus where OperatorID =@OperatorID" Dim cmd As sqlCommand = New sqlCommand(strsql,conn) cmd.Parameters.Add(New sqlParameter("@OperatorID",WorkLogInfo.OperatorID)) cmd.Parameters.Add(New sqlParameter("@logoutDate",WorkLogInfo.logoutDate)) cmd.Parameters.Add(New sqlParameter("@logoutTime",WorkLogInfo.logoutTime)) cmd.Parameters.Add(New sqlParameter("@OperatorStatus",WorkLogInfo.OperatorStatus)) Try conn.Open() If (cmd.ExecuteNonQuery > 0) Then WorkLogInfo.Success = True Else WorkLogInfo.Success = False End If Return WorkLogInfo Catch ex As Exception Return WorkLogInfo Finally conn.Close() End Try End Function
update 表名 set 所要更新字段 where 查询的条件
insert into 表名values(所要添加的字段(按照sql表的顺序排列))
select * from 表名 where 条件
扩展:select OperatorID as 教师,OperatorLevel as 用户级别,logonDate as 登录日期,logonTime as 登录时间,OperatorUseComputer as 机器名 from WorkLog_Info where OperatorStatus=@OperatorStatus
这样查出的记录可以让英文名字段显现出中文名字。
select count(*) as cout from 表名 where 记录条件
查出符合条件的记录个数。
select SUM(所要求和的字段) as 所要求和的字段 from 表名 where 条件
查询出符合条件的记录并且所要求和的字段进行求和。
select top 1 * from 表名 order by 字段名 desc
查出最近符合字段条件的一行记录。
五、DataSet DataTable DataReader DataGridView
DataSet里面有多个DataTable,所以我在结账的时候用到了DataSet和DataTable因为结账的时候,当用户名确定的时候要同时出现充值,退卡,购卡的记录显示在DataGridView控件里面我在BLL层的时候就把那三个查出来的记录放到了三个DataTable里面然后在存到一个DataSet中,然后把DataSet在返回到UI层,这样就和节省时间。
DataReader对象只允许以只读、顺向的方式查看其中所存储的数据,提供一个非常有效率的数据查看模式,同时DataReader对象还是一种非常节省资源的数据对象。
七、导出Excel
这个就直接贴代码了。
Public Class OutExcel ''' <summary> ''' 导出Excel ''' </summary> ''' <param name="GridView"></param> ''' <returns></returns> ''' <remarks></remarks> Function OutExcel(ByVal GridView As DataGridView) As Boolean Dim MyExcel As New Microsoft.Office.Interop.Excel.Application() MyExcel.Application.Workbooks.Add() MyExcel.Visible = True '获取标题 Dim Cols As Integer For Cols = 1 To GridView.Columns.Count MyExcel.Cells(1,Cols) = GridView.Columns(Cols - 1).HeaderText Next '往excel表里添加数据() Dim i As Integer For i = 0 To GridView.RowCount - 1 Dim j As Integer For j = 0 To GridView.ColumnCount - 1 If GridView(j,i).Value Is System.DBNull.Value Then MyExcel.Cells(i + 2,j + 1) = "" Else MyExcel.Cells(i + 2,j + 1) = GridView(j,i).Value End If Next j Next i Return True End Function End Class
八、Try..catch..finally...end try
Try
<所要测试的代码>
Catch ex As Exception
<如果出现异常则执行这个语句>
Finally
end try
九、打包。
连接:http://wenku.baidu.com/view/6d82c91e6bd97f192279e994.html
综述:第一遍做完以后最大的感受就轻松了许多,一起开始感觉很困难但是到最后越做越会做了。