机房收费系统完美设计——获得系统时间
2013-05-16 00:06
232 查看
为什么要获得系统时间?
情景:
教师登陆系统需要向系统中添加工作记录。教师关闭系统也需要更新工作记录。当然还有教师在线期间的所有的操作都需要向数据库中存入时间。
当教师登陆系统向数据库中添加了工作记录其中包括登录时间,但随后有人更改了教师使用的计算机的时间。此后教师的所有操作也需要读取系统时间存入数据库。此时如果我们只用简单度语句
**time=Date.Now
读取系统时间存入数据库会导致教师登陆的时间晚于教师操作的时间。也就是说教师还没有登录系统就已经操作系统的灵异事件。
当然解决这个办法有两个最基本的方法:
网络时间。
读取服务器时间。
对于读取网络时间来说,就必须保证系统运行的环境是能访问外网的。对于部署在局域网的系统不适用。所以我们采用方法2.
读取服务器时间。很简单的代码实现:
上面的代码就可以实现了。但是对于使用三层架构编程来说这段代码当然是放在那呢。创建connection链接sqlhelper里完成的。D层直接访问SQLHelper、所以放在D层合适。(sqlhelper的使用不在累述)但是一般情况下在U层就需要把需要插入记录的实体类的所有字段赋值。(一般思路)
但是我又想了。我现在是以文档为基础,画好图,写的代码。这样需要改动的地方有很多了。有没有其他的方法呢。答案当然是有的。
方法1:
在涉及到插入记录中包括服务器时间时。查询工作放在D层。D曾直接调用D曾的方法,无需作为参数传递。这是最直接的方法。其实只是摆脱了思维定势。
方法2:
定义触发器,当需要插入一条信息时对于需要插入时间的列自动插入系统时间。触发器代码如下:
缺点分析:
定义触发器对于数据库的依赖比较大。当需要更换数据库时需要在新的数据库中编写触发器。
定义的触发器一旦出现错误,无法在系统调试阶段给出准确的提示。排除错误需要一定的经验。
方法3:
在系统第一次运行的时候读取服务器时间。并开始一个timer,需要调用服务器时间时直接用第一次读到的时间加上timer走过的时间。所有的工作在U层完成。包括计算当前服务器时间,以及传参过程中对实体属性的赋值。
优点:摆脱了对数据库的依赖。
确定:每次调用服务器时间都要进行重新的计算而不是直接拿来用。
总结:以上只是个人的一些想法。不一定最好。只供参考,欢迎留下宝贵意见。
情景:
教师登陆系统需要向系统中添加工作记录。教师关闭系统也需要更新工作记录。当然还有教师在线期间的所有的操作都需要向数据库中存入时间。
当教师登陆系统向数据库中添加了工作记录其中包括登录时间,但随后有人更改了教师使用的计算机的时间。此后教师的所有操作也需要读取系统时间存入数据库。此时如果我们只用简单度语句
**time=Date.Now
读取系统时间存入数据库会导致教师登陆的时间晚于教师操作的时间。也就是说教师还没有登录系统就已经操作系统的灵异事件。
当然解决这个办法有两个最基本的方法:
网络时间。
读取服务器时间。
对于读取网络时间来说,就必须保证系统运行的环境是能访问外网的。对于部署在局域网的系统不适用。所以我们采用方法2.
读取服务器时间。很简单的代码实现:
Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim conn As ADODB.Connection Dim rs As ADODB.Recordset Dim datetime As Date conn = New ADODB.Connection conn.ConnectionString = "Provider=SQLOLEDB.1;Password=密码;Persist Security Info=True;User ID=用户名;Initial Catalog=数据库名;Data Source=服务器IP" conn.Open() rs = New ADODB.Recordset rs.Open("SELECT GETDATE() AS SvrTime", conn, 1, 1) datetime = rs.Fields("SvrTime").Value MsgBox(datetime)'显示服务器时间 rs.Close() conn.Close() rs = Nothing conn = Nothing End Sub End Class
上面的代码就可以实现了。但是对于使用三层架构编程来说这段代码当然是放在那呢。创建connection链接sqlhelper里完成的。D层直接访问SQLHelper、所以放在D层合适。(sqlhelper的使用不在累述)但是一般情况下在U层就需要把需要插入记录的实体类的所有字段赋值。(一般思路)
但是我又想了。我现在是以文档为基础,画好图,写的代码。这样需要改动的地方有很多了。有没有其他的方法呢。答案当然是有的。
方法1:
在涉及到插入记录中包括服务器时间时。查询工作放在D层。D曾直接调用D曾的方法,无需作为参数传递。这是最直接的方法。其实只是摆脱了思维定势。
方法2:
定义触发器,当需要插入一条信息时对于需要插入时间的列自动插入系统时间。触发器代码如下:
ALTER TRIGGER [dbo].[InsertCard] ON [dbo].[Card] AFTER INSERT AS declare @CardNo int declare @time varchar(50) BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; set @time= CONVERT(VARCHAR(50),GETDATE(),121) select @CardNo =_CardNo from inserted update Card set _CardStatic ='使用',_RegistDate =@time ,_RegistTime =@time ,_Status ='未结账' where _CardNo =@CardNo END
缺点分析:
定义触发器对于数据库的依赖比较大。当需要更换数据库时需要在新的数据库中编写触发器。
定义的触发器一旦出现错误,无法在系统调试阶段给出准确的提示。排除错误需要一定的经验。
方法3:
在系统第一次运行的时候读取服务器时间。并开始一个timer,需要调用服务器时间时直接用第一次读到的时间加上timer走过的时间。所有的工作在U层完成。包括计算当前服务器时间,以及传参过程中对实体属性的赋值。
优点:摆脱了对数据库的依赖。
确定:每次调用服务器时间都要进行重新的计算而不是直接拿来用。
总结:以上只是个人的一些想法。不一定最好。只供参考,欢迎留下宝贵意见。
相关文章推荐
- 机房收费系统完美设计——事务处理VS三层架构
- 机房收费系统完美设计——事务处理vs三层架构2
- 机房收费系统完美设计——参数传递+组合查询
- 机房收费系统-- 客户端与服务器 时间获取存在的问题
- 机房收费系统VB版(三)——窗体设计
- 机房收费系统阶段总结(1)数据库设计
- 【机房收费系统 4】:VB获取标准北京时间,免除时间误差
- 机房收费系统之报表设计器
- 【数据库】机房收费系统数据库设计
- VB.NET版机房收费系统之数据库设计
- 重构机房收费系统——数据库设计
- 【VB与数据库】机房收费系统设计阶段之结账
- 数据库设计说明书——机房收费系统
- 机房收费系统数据库设计说明书
- 【机房收费系统】时间控件的使用及显示当前电脑的名称
- 机房收费系统-- 客户端与服务器 时间获取存在的问题
- 机房收费系统数据库概念结构设计
- 机房收费系统(4)-更改设计
- 机房收费系统--设计模式思考
- 机房收费系统---数据库设计说明书