如何在 LINQ 查询中使用 SQL Server 时钟

发布于 2024-12-11 12:32:05 字数 228 浏览 0 评论 0原文

我正在编写一个具有“签入”功能的应用程序 - 本质上是一个系统托盘应用程序,通过写入 SQL 数据库每 20 秒进行一次签入。

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

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

我正在使用 Linq-to-SQL - 我怎样才能实现这一目标?

I'm writing an app which has a "check in" facility - essentially a system tray app that checks in every 20 seconds by writing to a SQL db.

I then have a second app that checks this table to see if the client has checked in, and performs an action if the client has not checked in for 60 seconds.

I need to ensure that the time written to the sql database is the local server time, not the client time - as otherwise I'll have synchronisation issues.

I'm using Linq-to-SQL - how can I acheive this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

落叶缤纷 2024-12-18 12:32:05

实际上,根据一般经验,您也不应该使用服务器的本地时间 - 使用 UTC 时间(协调世界时间)。

在 Linq to Sql 中,您可以使用 < code>SqlFunctions.GetUtcDate() 映射到 SQL Server 中的GETUTCDATE()

Actually as a general rule of thumb you should not use the local time of the server either - use UTC time (Coordinated Universal Time) instead.

In Linq to Sql you can use SqlFunctions.GetUtcDate() for this which maps to GETUTCDATE() in SQL Server.

ゝ杯具 2024-12-18 12:32:05

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

Write a user defined function that returns GetDate() and add it to you dbml file

我恋#小黄人 2024-12-18 12:32:05

试试这个:

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

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

Try this:

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

EDIT: this needs to be a part of your DataContext class.

梦言归人 2024-12-18 12:32:05

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

1) 在 SQL Server 中创建函数:

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();

This solution for any .NET version: it should be more beneficial for the speed and network traffic than other solutions.

1) create the function in SQL server:

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

2) Add function to your LINQ to SQL diagram into the Stored Procedures section

3) Call your function from your code

THEDBDataContext DBConn = new THEDBDataContext ();
DateTime dt = (DateTime) DBConn.GetSQLServerDate();
鸵鸟症 2024-12-18 12:32:05

Acaz Souza 的答案有效,但它需要成为数据上下文的一部分。要将其放在特定的数据上下文类之外(这可能更可重用),请尝试将其作为扩展方法:

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

Acaz Souza's answer works, but it needs to be part of the data context. To put it outside the specific data context class, which is probably more reusable, try this as an extension method:

public static DateTime GetSystemDate(this DataContext db)
{
    return db.ExecuteQuery<DateTime>("SELECT GETDATE()").Single();
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文