Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Преобразуването на тип данни datetime2 в тип данни smalldatetime доведе до стойност извън диапазона.\r\nИнструкцията е прекратена

От вида на грешката вашата база данни използва SmallDateTime като тип дата. Минималната му стойност е 1900-Jan-01. Ако приемем, че вашият обект е нещо като по-долу

  public class Game
  {
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid GameId { get; set; }

    [Required]
    public DateTime GameTime { get; set; }
  }

Вашата GameTime стойност не е nullable, така че когато не зададете никаква стойност за нея, тя винаги ще бъде DateTime.Min, която е 0000-Jan-01. Това е извън обхвата на SmallDateTime, но е в обхвата на DateTime2. Така че EF ще се опита да предаде SQL тип DateTime2 на SQL сървъра. Тъй като вашата база данни използва SmallDateTime, ще получите грешката, показана във вашия въпрос.

За да разрешите проблема, имате следните опции, за които се сещам:

  • направете полето nullalbe. (винаги трябва да проверявате дали въведените дати са в диапазона SmallDateTime.)

  • или променете типа дата на DateTime2 в SQL сървър

  • или принудете EF да използва тип данни DateTime2 при създаване на база данни. Кодът ще бъде като нещо по-долу. (Този метод трябва да е вътре във вашия контекстен клас.)


  protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity()
            .Property(t => t.GameTime )
            .HasColumnType("datetime2");
    }
  • Напишете помощник за преобразуване, за да зададете минималната стойност на свойството DateTime да съответства на smalldatetime във вашето приложение.

  • Напишете тригер в базата данни за преобразуване на DateTime2 (от края на приложението, но datetime2 в края на базата данни) в smalldatetime.

Надяваме се, че съм разбрал въпроса ви правилно и отговорът ми ще помогне.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Мога ли да получа името на всички таблици от базата данни на SQL Server в C# приложение?

  2. Може ли ограничение за проверка да се отнася до друга таблица?

  3. SSRS - Group_Concat Еквивалент с помощта на израз?

  4. Използвайте FILE_IDEX(), за да върнете идентификатора на файл с база данни в SQL Server

  5. Премахнете заглавката на колоната от резултата от заявката на SQL Server