datetime2 데이터 유형을 datetime 데이터 유형으로 변환하면 범위를 벗어난 값이 발생했습니다.


174

내 HomeController에 다음 코드가 있습니다.

public ActionResult Edit(int id)
{
    var ArticleToEdit = (from m in _db.ArticleSet where m.storyId == id select m).First();
    return View(ArticleToEdit);
}

[ValidateInput(false)]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(Article ArticleToEdit)
{
    var originalArticle = (from m in _db.ArticleSet where m.storyId == ArticleToEdit.storyId select m).First();
    if (!ModelState.IsValid)
        return View(originalArticle);

    _db.ApplyPropertyChanges(originalArticle.EntityKey.EntitySetName, ArticleToEdit);
    _db.SaveChanges();
    return RedirectToAction("Index");
}

그리고 이것은 Edit 메소드의 뷰입니다 :

<% using (Html.BeginForm()) {%>

    <fieldset>
        <legend>Fields</legend>
        <p>
            <label for="headline">Headline</label>
            <%= Html.TextBox("headline") %>
        </p>
        <p>
            <label for="story">Story <span>( HTML Allowed )</span></label>
            <%= Html.TextArea("story") %>
        </p>
        <p>
            <label for="image">Image URL</label>
            <%= Html.TextBox("image") %>
        </p>
        <p>
            <input type="submit" value="Post" />
        </p>
    </fieldset>

<% } %>

제출 버튼을 누르면 오류가 발생합니다. {"The conversion of a datetime2 data type to a datetime data type resulted in an out-of-range value.\r\nThe statement has been terminated."}문제가 무엇인지 아십니까? 편집 방법이 DB에 게시 된 값을 편집 된 것으로 업데이트하려고한다고 가정하지만 어떤 이유로 든 좋아하지는 않습니다 ... 나는 날짜에 언급되지 않은 날짜가 왜 관련되어 있는지 알지 못하지만 편집 컨트롤러 방법?


1
modelBuilder.Entity<WorldInfo>().Property(d => d.CurrentTime).HasColumnType("datetime2");
Anthony Nichols

답변:


166

문제는 ApplyPropertyChanges양식 (헤드 라인, 스토리 및 이미지)의 데이터로만 채워진 모델 객체와 함께 사용한다는 것 입니다. ApplyPropertyChanges초기화되지 않은을 포함하여 개체의 모든 속성에 변경 사항을 적용합니다.이 속성 DateTime은 SQL Server의 범위를 벗어난 0001-01-01로 설정되어 DATETIME있습니다.

을 사용하는 대신 ApplyPropertyChanges수정중인 객체를 검색하고 양식을 편집하는 특정 필드를 변경 한 다음 수정 사항으로 객체를 저장하는 것이 좋습니다. 이렇게하면 변경된 필드 만 수정됩니다. 다른 방법으로 채워진 다른 필드를 사용하여 페이지에 숨겨진 입력을 넣을 수는 있지만 동시 편집에는 적합하지 않습니다.

최신 정보:

다음은 객체의 일부 필드를 업데이트 한 테스트되지 않은 샘플입니다 (LINQ to SQL을 사용한다고 가정합니다).

var story = _db.ArticleSet.First(a => a.storyId == ArticleToEdit.storyId);
story.headline = ArticleToEdit.headline;
story.story = ArticleToEdit.story;
story.image = ArticleToEdit.image;
story.modifiedDate = DateTime.Now;
_db.SubmitChanges();

매우 도움이되었습니다 :) 날짜를 지정하지 않았을 때 왜 날짜가 변경되었는지 궁금합니다. 그런 다음 Edit 메소드를 변경하여 더 이상 ApplyPropertyChanges를 사용하지 않도록 할 수 있습니까? ASP.NET을 처음 사용하므로 현재 완전히 이해하지 못합니다. 고마워 친구
Cameron

날짜를 현재 날짜로 설정하려면 어떻게해야합니까? 기사가 업데이트 된 날짜 시간? 아마도 최선의 선택 일 것이므로 내가 가지고있는 ApplyPropertyChanges와 함께 작동한다고 가정합니다.
Cameron

내 편집본보기 ( modifiedDate귀하의 자산 이름 이라고 가정 )
Jacob

SubmitChanges가 내 앱에서 작동하지 않습니다 : / story.modifiedDate = DateTime.Now;현재 코드에 비트를 추가 할 수 있습니까? 감사합니다
Cameron

1
이 오류는 public DateTime 대신 public DateTime CreatedDate를 설정하면 발생합니까? DateTime이 null 일 수 없기 때문에 CreatedDate가 범위를 벗어난 오류를 발생시키는 이유 도움이 될 수 있지만 내 문제가 해결되었습니다.
adnan

115

이것은 Entity Framework를 사용할 때 사람들이 겪는 일반적인 오류입니다. 이는 저장중인 테이블과 연관된 엔티티에 필수 날짜 시간 필드가 있고 일부 값으로 설정하지 않은 경우 발생합니다.

기본 날짜 / 시간 객체는 값으로 만들어지며 01/01/1000null 대신 사용됩니다. 이것은 날짜 값 열을 보낼 수있는 날짜 시간 열로 전송됩니다.1753-01-01 00:00:00 이후 범위를 벗어난 예외가 발생합니다.

이 오류는 null을 허용하도록 데이터베이스 필드를 수정하거나 값으로 필드를 초기화하여 해결할 수 있습니다.


3
데이터베이스의 날짜 시간 필드가 선택적이고 값이 설정되지 않은 경우에 발생합니다. 따라서 이것은 일반적인 사람들의 실수가 아니며 EF 아키텍처 문제 중 하나입니다.
GSoft Consulting

1
나는 EF가 DB에서 유형을보고 그에 따라 조정하거나 더 정확한 오류를 던져야한다고 동의합니다. 거꾸로, 나는 당신이 일반적인 옵션 대신 2 개의 옵션을 제공했기 때문에 당신의 대답을 좋아합니다-최소 값으로 파일을 초기화하십시오.
DanteTheSmith

43

DATETIME1753/1/1부터 "영원"까지 (9999/12/31), DATETIME20001/1/1부터 영원까지 지원합니다.

MSDN

답 :DateTime '0001/1/1'값 으로 저장하려고한다고 가정합니다 . 그것은, 만약 그렇다면 다음 대체 그냥 브레이크 포인트 설정 및 디버그 DateTime으로 null또는 세트 정상 날짜입니다.


컨트롤러에 무엇을 넣어야합니까? 디버깅하면 위에서 게시 한 오류가 발생합니다. 감사.
Cameron

여기에 오류가있는 것 같습니다-> _db.SaveChanges (); 이 줄 앞에 중단 점을 설정할 수 있습니다.
Andrew Orsich

그래 그런 다음 SaveChanges에 오류가 있음을 나타내므로 InnerException을보고 게시 된 오류로 인해 오류라고 말합니다!
Cameron

_db.SaveChanges () 전에 DateTime 값을 확인 했습니까? 부름? '1753/1/1'보다 커야합니다.
앤드류 Orsich

originalArticle 날짜 값은 {18/10/2009 00:00:00}이고 ArticleToEdit 날짜 값은 {01/01/0001 00:00:00}이므로 날짜를 모든 날짜 중 첫 번째 날짜로 변경하려는 것 같습니다. 내가 원하는 것을 원하지 않지만 형식이 동일하기 때문에 왜 오류가 발생하는지 설명하지 않습니까?
Cameron

14

이것은 나를 미치게했다. nullable 날짜 시간 ( DateTime?)을 사용하지 않으려 고했습니다 . SQL 2008의 datetime2 유형 중 하나를 사용할 수있는 옵션이 없습니다 ( modelBuilder.Entity<MyEntity>().Property(e => e.MyDateColumn).HasColumnType("datetime2");).

나는 결국 다음을 선택했다.

public class MyDb : DbContext
{
    public override int SaveChanges()
    {
        UpdateDates();
        return base.SaveChanges();
    }

    private void UpdateDates()
    {
        foreach (var change in ChangeTracker.Entries<MyEntityBaseClass>())
        {
            var values = change.CurrentValues;
            foreach (var name in values.PropertyNames)
            {
                var value = values[name];
                if (value is DateTime)
                {
                    var date = (DateTime)value;
                    if (date < SqlDateTime.MinValue.Value)
                    {
                        values[name] = SqlDateTime.MinValue.Value;
                    }
                    else if (date > SqlDateTime.MaxValue.Value)
                    {
                        values[name] = SqlDateTime.MaxValue.Value;
                    }
                }
            }
        }
    }
}

10

모델에 추가하여이 문제를 해결할 수도 있습니다 (Entity Framework 버전> = 5).

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime CreationDate { get; set; }

8

날짜 시간이고 열을 허용하는 열이 있으면이 오류가 발생합니다. .SaveChanges (); 전에 객체에 전달할 값을 설정하는 것이 좋습니다.


5

다음과 같이 모델을 변경 한 후 (코드 우선)이 오류가 발생했습니다.

public DateTime? DateCreated

public DateTime DateCreated

DateCreated에 널값이있는 행이 있으면이 오류가 발생했습니다. 따라서 표준 값으로 필드를 초기화 하려면 SQL UPDATE 문을 수동으로 사용해야했습니다 .

다른 해결책은 제출 된 기본값을 지정하는 것일 수 있습니다.


3

필자의 경우 데이터베이스 테이블에서 사용하고있는 클래스의 초기화 프로그램에서 기본값을 내 DateTime 속성으로 설정하지 않아 @Andrew Orsich의 답변에 설명 된 문제가 발생했습니다. 그래서 방금 속성을 nullable로 만들었습니다. 또는 생성자에 DateTime.Now를 부여 할 수도 있습니다. 그것이 누군가를 돕기를 바랍니다.


3

엔티티 프레임 워크를 사용하고있는 것 같습니다. 내 솔루션은 모든 datetime 열을 datetime2로 전환하고 새 열에 datetime2를 사용하는 것입니다. 즉, EF가 기본적으로 datetime2를 사용하도록합니다. 컨텍스트의 OnModelCreating 메소드에 이것을 추가하십시오.

modelBuilder.Properties<DateTime>().Configure(c => c.HasColumnType("datetime2"));

모든 DateTime과 DateTime을 얻을 수 있습니까? 모델의 모든 엔티티에 대한 속성.


2

불행히도 같은 문제가 발생했습니다. 모델에 두 개의 DateTime 속성이 있고 SaveChanges를 수행하기 전에 하나의 DateTime 속성이 null입니다.

따라서 변경 사항을 저장하기 전에 모델에 DateTime 값이 있는지 확인하거나 오류를 방지하기 위해 null을 허용하십시오.

public DateTime DateAdded { get; set; }   //This DateTime always has a value before persisting to the database.
public DateTime ReleaseDate { get; set; }  //I forgot that this property doesn't have to have DateTime, so it will trigger an error

따라서 이것은 데이터베이스에 유지하기 전에 모델 날짜가 올바른지 확인하는 문제를 해결합니다.

public DateTime DateAdded { get; set; }
public DateTime? ReleaseDate { get; set; }

2

Entity Framework 버전> = 5를 사용하는 경우 [DatabaseGenerated (DatabaseGeneratedOption.Computed)] 주석을 클래스의 DateTime 속성에 적용하면 데이터베이스 테이블의 트리거가 원인없이 레코드 생성 및 레코드 업데이트를 위해 날짜를 입력하는 작업을 수행 할 수 있습니다. 개그에 대한 Entity Framework 코드

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime DateCreated { get; set; }

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime DateUpdated { get; set; }

이것은 Dongolo Jeno가 작성하고 Gille Q가 편집 한 6 번째 답변과 비슷합니다.


1

또한 오류가 발생한 코드의 일부를 모르는 경우 mssql에 통합 된 SQL 프로파일 러를 사용하여 "잘못된"SQL 실행을 프로파일 링 할 수 있습니다.

나쁜 날짜 시간 매개 변수는 다음과 같이 표시됩니다.

나쁜 매개 변수


1

이 문제는 일반적으로 엔터티를 업데이트하려고 할 때 발생합니다. 예를 들어, 당신은라는 필드가 포함 된 개체가 DateCreated있다 [필수] 업데이트에 특정 엔티티를 할 때 당신은 기록을 삽입 오류가 반환되지만 때하여 얻을

datetime2 변환이 범위를 벗어났습니다.

이제 해결책이 있습니다.

편집보기에서, 예 edit.cshtml를 들어 MVC 사용자의 경우 숨겨진 양식 필드를 추가하기 만하면됩니다.DateCreated 의 경우 편집 데이터의 기본 키에 대해 숨겨진 필드 바로 아래에 됩니다.

예:

@Html.HiddenFor(model => model.DateCreated)

이것을 편집보기에 추가하면 내가 확신하는 오류가 발생하지 않습니다.


1

날짜 변수에 null 값을 활성화해야합니다.

 public Nullable<DateTime> MyDate{ get; set; }

0

속성을 nullable로 설정하십시오.

    public DateTime? Time{ get; set; }

나를 위해 일했다.


0

DB에 대한 액세스 권한이 있으면 DB 열 유형을 datetime에서 datetime2 (7)로 변경할 수 있으며 여전히 datetime 객체를 전송하고 저장됩니다


0

모델에는 널 입력 가능 날짜 시간이 있어야합니다. ApplyPropertyChanges 대신 수정해야 할 객체를 검색하는 앞서 제안 된 방법을 사용해야합니다. 제 경우에는이 방법을 사용하여 객체를 저장했습니다.

public ActionResult Save(QCFeedbackViewModel item)

그런 다음 서비스에서 다음을 사용하여 검색합니다.

RETURNED = item.RETURNED.HasValue ? Convert.ToDateTime(item.RETURNED) : (DateTime?)null 

전체 서비스 코드는 다음과 같습니다.

 var add = new QC_LOG_FEEDBACK()
            {

                QCLOG_ID = item.QCLOG_ID,
                PRE_QC_FEEDBACK = item.PRE_QC_FEEDBACK,
                RETURNED = item.RETURNED.HasValue ? Convert.ToDateTime(item.RETURNED) : (DateTime?)null,
                PRE_QC_RETURN = item.PRE_QC_RETURN.HasValue ? Convert.ToDateTime(item.PRE_QC_RETURN) : (DateTime?)null,
                FEEDBACK_APPROVED = item.FEEDBACK_APPROVED,
                QC_COMMENTS = item.QC_COMMENTS,
                FEEDBACK = item.FEEDBACK
            };

            _context.QC_LOG_FEEDBACK.Add(add);
            _context.SaveChanges();

0

[해결 방법] Entity Framework Code First (내 경우)에서 내 문제 DateTimeDateTime?해결하기 위해 변경 되었습니다 .

/*from*/ public DateTime SubmitDate { get; set; }
/*to  */ public DateTime? SubmitDate { get; set; }

0

오류 : datetime2 데이터 유형을 datetime 데이터 유형으로 변환하면 범위를 벗어난 값이 발생했습니다.

이 오류 는 EF를 사용하여 SQL DB의 NOT NULL 날짜 열에 대해 값을 지정 하지 않아서 발생 했으며 동일하게 지정하여 해결되었습니다.

도움이 되었기를 바랍니다!


0

Database First 접근법에서 클래스를 만들 때이 문제가 발생했습니다. 단순히 Convert.DateTime (dateCausingProblem)을 사용하여 해결 실제로 전달하기 전에 항상 값을 변환하려고하면 예기치 않은 값에서 벗어날 수 있습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.