2014-10-28 3 views
1

Visual Studio 2012에서 C# 프로그램을 개발할 때 Entity Framework를 사용하고 있습니다. 데이터베이스 테이블에 레코드를 추가하고 싶습니다. 레코드 (객체)에는 NULL 값을 허용하지 않는 속성 (TRANSACTION_DATE)이 있으며 DateTime 형식입니다. 데이터베이스에서 내가이 형식을 목표로하고 있습니다 :datetime2 데이터 형식을 datetime 데이터 형식으로 변환하면 범위를 벗어나는 값이되었습니다.

newEntry.TRASACTION_DATE = DateTime.ParseExact(DateTime.Now.ToString(), 
          "yyyy-MM-dd HH:mm:ss.fff", CultureInfo.InvariantCulture); 

그러나 그것은 나에게 오류를주고 :

yyyy-MM-dd HH:mm:ss.fff

그래서 내가 그것을 현재 날짜와 시간을 전달하려면, 내 코드는 다음과 같다

The conversion of a datetime2 data type to a datetime data type resulted in an out-of-range value.

내가 원하는 형식으로 변환되지 않는 이유를 알고 싶습니다.

제약 : enter image description here

enter image description here

+2

왜 'DateTime.Now'를 문자열로 변환 한 다음 다시 돌아가고 있습니까? 그냥'DateTime.Now'를 사용하십시오 ... 그리고 데이터베이스 값은 형식을 갖지 않습니다. 본질적으로 - 문자열로 변환 할 때 사용되는 형식은 저장된 내용과 무관합니다. –

+0

이 내가 원하는 형식이 아니기 때문에 – lcc

+0

이 'datetime 범위를 벗어난'예외는 거의 항상 데이터베이스에 '01 -01-0001 00:00:00 '을 저장하려는 시도에 빠졌습니다. 데이터베이스가 – paul

답변

2

데이터베이스를 특정 문자열 형식으로 값을 저장하는 것으로 생각하지 않아야합니다. 숫자를 십진수 또는 16 진수로 저장하는 것 이상이면됩니다.

대신 날짜/시간으로 표시해야합니다. 예 :

// TODO: Do you really want the local time, rather than UtcNow? 
// TODO: Change TRANSACT_DATE to be TransactionDate ideally, to follow 
// .NET naming conventions 
newEntry.TRANSACT_DATE = DateTime.Now; 

값을 검색하면 그 시점에서도 DateTime을 얻게됩니다. 그런 다음 값을 사용자에게 표시하려면 특정 형식을 적용 할 수 있습니다. 서로 다른 사용자가 서로 다른 형식을 원할 수도 있습니다. 또한 서로 다른 시간대에 같은 날짜/시간을 표시하고자 할 수도 있습니다.

저장하는 내장 데이터 (이 경우 날짜/시간)와 특정 상황/응용 프로그램을 표시하는 데 사용되는 텍스트 형식을 구별하는 것이 중요합니다. 실제로 필요하지 않은 경우 언제든지 문자열로의/문자열 변환을 피해야합니다. 이상적으로는 애플리케이션의 경계에만 있어야합니다. 사용자에게 텍스트를 표시 할 때 또는 잠재적으로 JSON 또는 XML로 직렬화 할 때. API를 사용하면 이 아닌 (예 : 데이터베이스 매개 변수) 변환을 수행 할 수 있으므로이를 피해야합니다.

현재 오류가 있습니다. 입력하지 않는 필드가 다른 것일 수 있으며, 따라서 default(DateTime)이 범위를 벗어납니다. 그럴 경우 많은 의미가 있습니다. DateTime.Now은 별개의 제약 조건을 적용하거나 시스템 클록을 초과하지 않는 한 실제로 범위를 벗어나면 안됩니다.

+0

나는 처음부터이 방법을 사용했고, 나에게도 같은 오류가 발생했다. – lcc

+0

@ lcc : 스키마 등등에 대해 더 자세히 말하면 도움이 될 것입니다. 데이터베이스 필드에 다른 제약 조건이 있습니까? 데이터베이스에 의해 자동으로 채워지 는가? –

+0

@lcc : 또 다른 가능성에 대한 편집 된 답변보기 - 완전히 다른 분야인지 궁금합니다. 오류 메시지 *가 * 값이 범위를 벗어 났습니까? 데이터베이스 테이블에는 몇 개의 날짜/시간 필드가 있습니까? –

1

DateTime에 상관없이 형식입니다. 당신이 가진 것과 같은 프리젠 테이션 형식은 단지 목적을 표시하기위한 것입니다. DateTime을 문자열로 변환 한 다음 사용자 정의 형식으로 구문 분석 할 필요가 없습니다. 그냥 단순히처럼 자신의 분야에 DateTime을 할당 : SQL Server의

newEntry.TRASACTION_DATE = DateTime.Now; 

DateTime 당신의 구문 분석 코드는 올해 1753보다 DateTime 작은 값을 결과한다 January 1, 1753, through December 31, 9999의 범위를 가지고 있으며, 당신이 예외를 얻고있는 이유입니다.

+0

나는이 하나를 사용하고 나에게 내가 원하는 형식으로 변환하려는 이유는 처음에 나에게 같은 오류를 주었다. – lcc

+0

@lcc, DB에있는 'TRANSACTION_DATE'의 데이터 유형은 무엇입니까? – Habib

+0

DateTime 형식 @Habib – lcc

0

데이터베이스의 열 유형을 datetime2으로 바꿀 수 있습니까?이것은 Microsoft's recommendation입니다. 일부 .Net datetime 값은 datetime에 적합하지 않지만 datetime2 유형은 모두 .Net datetimes을 보유 할 수 있습니다 (예 : 반올림 2010-05-05 23:59:59.999에서 2010-05-06으로 미묘한 버그가 발생하지 않음).

datetime와는 대조적으로 datetime2을 정수로 처리하는 것은 적합하지 않습니다 (예 : mydate+1과 같은 항목으로 처리).

datetime2으로 전환하는 것이 옵션이 아니면 datetime2 대신이 날짜를 명시 적으로 datetime으로 처리하도록 ORM 코드를 구성하십시오. 이렇게해도 오류는 해결되지 않지만 나중에 쿼리를 보내기 전에 유효성 검사가 실패하여 수정하기가 더 쉽습니다.

선택 사항에 관계없이이 문제를 해결하기 위해 문자열을 변환하거나 문자열을 변환하지 마십시오. 그것은 해킹보다 더 많은 문제를 일으킨다.

+0

을 볼 수 있도록 그림을 추가했습니다. 테이블을 삭제하거나 테이블을 다시 만들어 datetime2가되도록 열 유형을 변경해야한다고 말합니다. 그리고 나는 그것을 할 수 없었다. – lcc

+0

어떻게이 날짜를 datetime으로 명시 적으로 처리하도록 ORM 코드를 구성 할 수 있습니까? – lcc

+0

@lcc : 제 자신의 테스트 중에, 열 유형을 변경하기 위해 테이블을 삭제하는 것은 SMSS 인터페이스 (스키마 바인딩 된 것은 물론 간섭을 일으킴)가 아닌 T-SQL을 통해 열을 변경한다는 조건에서는 필요하지 않지만 확인하십시오 테스트 DB에서 직접 확인하십시오. ORM 코드를 변경하는 것과 관련하여 나는 어떤 ORM을 사용하고 있는지 알지 못합니다. 'SqlParameter'의 경우,'DbType'을'System.Data.DbType.DateTime'으로 설정합니다. – Brian

관련 문제