机房收费系统完美设计——获得系统时间


为什么要获得系统时间?

情景:

教师登陆系统需要向系统中添加工作记录。教师关闭系统也需要更新工作记录。当然还有教师在线期间的所有的操作都需要向数据库中存入时间。

当教师登陆系统向数据库中添加了工作记录其中包括登录时间,但随后有人更改了教师使用的计算机的时间。此后教师的所有操作也需要读取系统时间存入数据库。此时如果我们只用简单度语句

**time=Date.Now

读取系统时间存入数据库会导致教师登陆的时间晚于教师操作的时间。也就是说教师还没有登录系统就已经操作系统的灵异事件。

当然解决这个办法有两个最基本的方法:

  1. 网络时间。
  2. 读取服务器时间。

对于读取网络时间来说,就必须保证系统运行的环境是能访问外网的。对于部署在局域网的系统不适用。所以我们采用方法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

缺点分析:

  1. 定义触发器对于数据库的依赖比较大。当需要更换数据库时需要在新的数据库中编写触发器。
  2. 定义的触发器一旦出现错误,无法在系统调试阶段给出准确的提示。排除错误需要一定的经验。

方法3

在系统第一次运行的时候读取服务器时间。并开始一个timer,需要调用服务器时间时直接用第一次读到的时间加上timer走过的时间。所有的工作在U层完成。包括计算当前服务器时间,以及传参过程中对实体属性的赋值。

优点:摆脱了对数据库的依赖。

确定:每次调用服务器时间都要进行重新的计算而不是直接拿来用。


总结:以上只是个人的一些想法。不一定最好。只供参考,欢迎留下宝贵意见。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值