3

SQLサーバーが現在の時刻を取得する方法とc#コンパイラが現在の時刻を取得する方法は異なる可能性がありますか?

SQL Serverテーブルにトリガーがあり、更新のたびにupdateDatetime列が現在の日時に更新されます。

私はこの現在の日時を次のように取得しますcurrent_timestamp

このデータベースに接続し、ネイティブSQLを使用してテーブルを更新するac#コードもあります。この後、トリガーが作成されます。

問題は、更新を行うNUnitでテストを実行してから、変更された行を取得することです。テストの開始時にupdatedDatetimeを現在のものと比較すると、それらは異なります。私はこれをDateTime.UtcNow

違いはミリ秒単位ですが、面白いのは、テストの最初からの1つが、トリガーからの1つの後に発生することです。それは意味がありません。

ここに私が言っていることを説明するためのいくつかのコードがあります

                DateTime dateTimeBefore = DateTime.UtcNow;

                // Act
                bookDao.Update(book);

                // Assert
                alteredBook = bookDao.GetByKey(bookingDao);


                Console.WriteLine("dateTimeBefore: {0} - {1}", dateTimeBefore, dateTimeBefore.Millisecond);
                Console.WriteLine("UpdateDateTime: {0} - {1}", alteredBook.UpdatedDateTime, alteredBook.UpdatedDateTime.Millisecond);

                Assert.IsTrue(alteredBook.UpdatedDateTime >= dateTimeBefore);

これがトリガーになります

update Book set UpdatedDatetime = current_timestamp from inserted where inserted.Id = Booking.Booking.Id

4

1 に答える 1

1

current_timeは、「SQL Serverのインスタンスが実行されているコンピューターのオペレーティングシステムから派生している」ため、datetime.nowも実行します。ユニットテストがnunitとSQLサーバーインスタンスが別のマシンで実行されているマシンで実行されている場合、この2つの値の比較結果は、各マシンの現地時間設定によって異なります。

さらに、2つの値(SQLサーバーのdatetimeタイプとdatetime.nowのcurrent_timestamp)の精度が異なる同じマシンでも、DateTimeからSqlDateTimeへの変換は不正確です。

于 2012-11-28T12:54:00.653 に答える