Как использовать часы сервера SQL в запросе LINQ - PullRequest
4 голосов
/ 23 октября 2011

Я пишу приложение, в котором есть функция «регистрации» - по сути, это приложение в системном трее, которое проверяет каждые 20 секунд, записывая в базу данных SQL.

Затем у меня есть второе приложение, которое проверяетэту таблицу, чтобы увидеть, зарегистрировался ли клиент и выполняет ли действие, если клиент не зарегистрировался в течение 60 секунд.

Мне нужно убедиться, что время, записанное в базу данных sql, является временем локального сервера,не клиентское время - иначе у меня будут проблемы с синхронизацией.

Я использую Linq-to-SQL - как я могу добиться этого?

Ответы [ 5 ]

4 голосов
/ 23 октября 2011

На самом деле, как общее практическое правило, вы также не должны использовать локальное время сервера - вместо этого используйте время UTC ( Всемирное координированное время ).

В Linq to Sql вы можетеиспользуйте для этого SqlFunctions.GetUtcDate(), который сопоставляется с GETUTCDATE() в SQL Server.

4 голосов
/ 23 октября 2011

Попробуйте:

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

РЕДАКТИРОВАТЬ: это должно быть частью вашего класса DataContext.

4 голосов
/ 23 октября 2011

Напишите пользовательскую функцию, которая возвращает GetDate(), и добавьте ее в файл dbml

1 голос
/ 09 декабря 2013

Ответ Acaz Souza работает, но он должен быть частью контекста данных. Чтобы поместить его вне определенного класса контекста данных, который, вероятно, более пригоден для повторного использования, попробуйте это как метод расширения:

public static DateTime GetSystemDate(this DataContext db)
{
    return db.ExecuteQuery<DateTime>("SELECT GETDATE()").Single();
}
1 голос
/ 01 октября 2012

Это решение для любой версии .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();
...