Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在等待至少3.3毫秒后,MSSQL在从C#.Net调用的SP中未使用GetUTCDate()返回唯一的datetime值_C#_Sql Server 2005_Datetime_Stored Procedures_.net 3.5 - Fatal编程技术网

在等待至少3.3毫秒后,MSSQL在从C#.Net调用的SP中未使用GetUTCDate()返回唯一的datetime值

在等待至少3.3毫秒后,MSSQL在从C#.Net调用的SP中未使用GetUTCDate()返回唯一的datetime值,c#,sql-server-2005,datetime,stored-procedures,.net-3.5,C#,Sql Server 2005,Datetime,Stored Procedures,.net 3.5,我有以下存储过程来检索新的日期时间: CREATE PROCEDURE [dbo].[GetTransactionTime] AS BEGIN SELECT [TransactionTime] = GetUTCDate() END 为了调用这个SP,我在本地数据库上使用了一个简单的C#数据集 由于来自SQL的datetime的精度为3.3毫秒,我必须等待至少3.3毫秒才能获得新的datetime。请参阅msdn上有关精度的更多信息: 在下面的示例中,我将等待5毫秒: class

我有以下存储过程来检索新的日期时间:

CREATE PROCEDURE [dbo].[GetTransactionTime] 
AS
BEGIN
      SELECT [TransactionTime] = GetUTCDate()
END
为了调用这个SP,我在本地数据库上使用了一个简单的C#数据集

由于来自SQL的datetime的精度为3.3毫秒,我必须等待至少3.3毫秒才能获得新的datetime。请参阅msdn上有关精度的更多信息:

在下面的示例中,我将等待5毫秒:

class Program
{
    static void Main(string[] args)
    {
        var adapter = new SPTableAdapters.TransactionTimeTableAdapter();
        do
        {
            GetTransactionTime(
                    new Func<DateTime>(() => { return (DateTime)adapter.GetTransactionTimeNOW(); })
                );
        } while (true);

    }

    public static DateTime lastTransactionTime = DateTime.MinValue;

    private static bool IsTransactionTimeUnique(DateTime newTransactionTime)
    {
        if (newTransactionTime > lastTransactionTime)
        {
            lastTransactionTime = newTransactionTime;
            return true;
        }
        return false;
    }

    public static void GetTransactionTime(Func<DateTime> funcGetTransactionTime)
    {
        DateTime newTransactionTime = funcGetTransactionTime();
        //MSSQL datetime has a off 3.33ms; try 5ms
        DateTime now = DateTime.UtcNow;
        DateTime max = now.AddMilliseconds(5);

        while (!IsTransactionTimeUnique(newTransactionTime))
        {
            DateTime backup = DateTime.UtcNow;
            if (backup > max) //if we tried more than 5ms.
            {

                //Always try once again.
                newTransactionTime = funcGetTransactionTime();

                if (IsTransactionTimeUnique(newTransactionTime))
                {
                    break;
                }

                Console.WriteLine("FAILED: Old datetime: " + lastTransactionTime.ToBinary() + " New datetime: " + newTransactionTime.ToBinary() + "Start: " + now.Millisecond + " End: " + backup.Millisecond + " Max: " + max.Millisecond);
                return; ;
            }

            newTransactionTime = funcGetTransactionTime();
        }
        Console.WriteLine("OK!");
    }
}
MSSQL不会每5毫秒给我一个唯一的datetime,将5毫秒改为20毫秒可以工作,但我不明白为什么5毫秒不工作。希望有人能澄清这一点


提前感谢。

Windows仅以50毫秒为周期更新其当前日期/时间。

Windows仅以50毫秒为周期更新其当前日期/时间。

这里有几篇关于此主题的文章,但基本上Windows时间的更新频率低于每3.3毫秒更新一次

还有一篇关于GetTickCount精度的msdn文章:


这里有几篇关于这个主题的文章,但基本上是关于Windows时间的更新频率低于每3.3毫秒更新一次

还有一篇关于GetTickCount精度的msdn文章:


此操作系统是否依赖于操作系统?如果我在一个循环中运行
getdate()
,我不会得到50毫秒的间隔。是否有一个网站的msdn包含更多关于此的信息?50毫秒来自内存。。。我记不起这个数字了,但它超过了5毫秒。这来自原始的IMB PC(4.77MHz和一个盒式端口,可选的软盘,什么是硬盘?)RTC中断。这取决于操作系统吗?如果我在一个循环中运行
getdate()
,我不会得到50毫秒的间隔。是否有一个网站的msdn包含更多关于此的信息?50毫秒来自内存。。。我记不起这个数字了,但它超过了5毫秒。这来自原始的IMB PC(4.77MHz和盒式磁带端口,可选的软盘,硬盘是什么?)RTC中断。SysUtcDateTime()函数可能是更好的使用方法。您不应该依赖于datetime的唯一性,很多事情可能会出问题。SysUtcDateTime()函数函数可能是一个更好的使用方法。您不应该依赖于datetime的唯一性,很多事情都会出错。
FAILED: Old: 487 New: 487 Start: 479 End: 484 Max: 484
FAILED: Old: 487 New: 487 Start: 484 End: 489 Max: 489
FAILED: Old: 487 New: 487 Start: 489 End: 494 Max: 494
OK!
FAILED: Old: 503 New: 503 Start: 495 End: 500 Max: 500
FAILED: Old: 503 New: 503 Start: 500 End: 505 Max: 505
OK!
FAILED: Old: 517 New: 517 Start: 510 End: 515 Max: 515
FAILED: Old: 517 New: 517 Start: 515 End: 520 Max: 520
FAILED: Old: 517 New: 517 Start: 520 End: 525 Max: 525
OK!
FAILED: Old: 533 New: 533 Start: 526 End: 531 Max: 531
FAILED: Old: 533 New: 533 Start: 531 End: 536 Max: 536
OK!
FAILED: Old: 550 New: 550 Start: 541 End: 546 Max: 546
FAILED: Old: 550 New: 550 Start: 546 End: 551 Max: 551
FAILED: Old: 550 New: 550 Start: 551 End: 556 Max: 556
OK!