我正在编写一个应用程序,该应用程序具有“签入”工具 - 本质上是一个系统托盘应用程序,通过写入SQL数据库每20秒检查一次。如何在LINQ查询中使用SQL服务器时钟
然后我有第二个应用程序检查此表以查看客户端是否已签入,并在客户端未检入60秒时执行操作。
我需要确保写入sql数据库的时间是本地服务器时间,而不是客户端时间 - 否则我会遇到同步问题。
我正在使用Linq-to-SQL - 我该如何实现这一目标?
我正在编写一个应用程序,该应用程序具有“签入”工具 - 本质上是一个系统托盘应用程序,通过写入SQL数据库每20秒检查一次。如何在LINQ查询中使用SQL服务器时钟
然后我有第二个应用程序检查此表以查看客户端是否已签入,并在客户端未检入60秒时执行操作。
我需要确保写入sql数据库的时间是本地服务器时间,而不是客户端时间 - 否则我会遇到同步问题。
我正在使用Linq-to-SQL - 我该如何实现这一目标?
其实作为一个一般的经验规则,你不应该使用的服务器在本地时间 - 使用UTC时间(Coordinated Universal Time)来代替。
在Linq to Sql中,您可以使用SqlFunctions.GetUtcDate()
来映射到SQL Server中的GETUTCDATE()
。
'SqlFunctions.GetUtcDate()'是链接到实体没有链接到SQL – Magnus
写一个用户定义的函数,返回GetDate()
并将其添加到您的dbml文件
试试这个:
[Function(Name="GetDate", IsComposable=true)]
public DateTime GetSystemDate()
{
MethodInfo mi = MethodBase.GetCurrentMethod() as MethodInfo;
return (DateTime)this.ExecuteMethodCall(this, mi, new object[]{}).ReturnValue;
}
编辑:这需要在您的DataContext类的一部分。
该解决方案适用于任何.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();
**请DONT SHOUT ** - 认真:所有大写文本难以阅读,加粗大量文本隐藏了真正重要的内容 – kleopatra
Acaz Souza的答案有效,但它需要成为数据上下文的一部分。说得具体的数据上下文类,这可能是更多的可重复使用的外,试试这个作为一个扩展的方法:
public static DateTime GetSystemDate(this DataContext db)
{
return db.ExecuteQuery<DateTime>("SELECT GETDATE()").Single();
}
这帮助我使用LinqPad在我的远程服务器上计算出日期和时间。无论如何,这里是如何与UTC日期和时间做到这一点:ExecuteQuery
其他选项是切换到QueryOver: [唱电流时间戳功能于NHibernate的,queryover -syntax](https://stackoverflow.com/questions/6155454/using-current-timestamp-in-nhibernate-queryover-syntax) –