为什么要获得系统时间?
情景:
教师登陆系统需要向系统中添加工作记录。教师关闭系统也需要更新工作记录。当然还有教师在线期间的所有的操作都需要向数据库中存入时间。
当教师登陆系统向数据库中添加了工作记录其中包括登录时间,但随后有人更改了教师使用的计算机的时间。此后教师的所有操作也需要读取系统时间存入数据库。此时如果我们只用简单度语句
**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层完成。包括计算当前服务器时间,以及传参过程中对实体属性的赋值。
优点:摆脱了对数据库的依赖。
确定:每次调用服务器时间都要进行重新的计算而不是直接拿来用。
总结:以上只是个人的一些想法。不一定最好。只供参考,欢迎留下宝贵意见。