2011-10-22 52 views
4

我正在编写一个应用程序,该应用程序具有“签入”工具 - 本质上是一个系统托盘应用程序,通过写入SQL数据库每20秒检查一次。如何在LINQ查询中使用SQL服务器时钟

然后我有第二个应用程序检查此表以查看客户端是否已签入,并在客户端未检入60秒时执行操作。

我需要确保写入sql数据库的时间是本地服务器时间,而不是客户端时间 - 否则我会遇到同步问题。

我正在使用Linq-to-SQL - 我该如何实现这一目标?

+0

其他选项是切换到QueryOver: [唱电流时间戳功能于NHibernate的,queryover -syntax](https://stackoverflow.com/questions/6155454/using-current-timestamp-in-nhibernate-queryover-syntax) –

回答

4

写一个用户定义的函数,返回GetDate()并将其添加到您的dbml文件

4

试试这个:

[Function(Name="GetDate", IsComposable=true)] 
public DateTime GetSystemDate() 
{ 
    MethodInfo mi = MethodBase.GetCurrentMethod() as MethodInfo; 
    return (DateTime)this.ExecuteMethodCall(this, mi, new object[]{}).ReturnValue; 
} 

编辑:这需要在您的DataContext类的一部分。

1

该解决方案适用于任何.NET版本:与其他解决方案相比,它对速度和网络流量应该更有利。

1)创建SQL服务器的功能:

CREATE FUNCTION [dbo].[GetSQLServerDate] 
() 
RETURNS datetime 
AS 
BEGIN 
    DECLARE @Result datetime 
    SELECT @Result = getdate() 
    RETURN @Result 
END 
GO 

2)添加到您的LINQ to SQL图表添加功能到存储过程部分

3)从你的代码中调用函数

THEDBDataContext DBConn = new THEDBDataContext(); 
DateTime dt = (DateTime) DBConn.GetSQLServerDate(); 
+2

**请DONT SHOUT ** - 认真:所有大写文本难以阅读,加粗大量文本隐藏了真正重要的内容 – kleopatra

1

Acaz Souza的答案有效,但它需要成为数据上下文的一部分。说得具体的数据上下文类,这可能是更多的可重复使用的外,试试这个作为一个扩展的方法:

public static DateTime GetSystemDate(this DataContext db) 
{ 
    return db.ExecuteQuery<DateTime>("SELECT GETDATE()").Single(); 
} 
+0

这帮助我使用LinqPad在我的远程服务器上计算出日期和时间。无论如何,这里是如何与UTC日期和时间做到这一点:ExecuteQuery (“SELECT GETUTCDATE()”)。Single()。Dump(); –