5 개의 열이있는 데이터 테이블이 있는데 행은 데이터로 채워지고 트랜잭션을 통해 데이터베이스에 저장됩니다.
저장하는 동안 오류가 반환됩니다.
datetime2 데이터 유형을 datetime 데이터 유형으로 변환하면 범위를 벗어난 값이 발생했습니다.
내 데이터 테이블에는 유형이 DateTime2
있고 내 데이터베이스에는 DateTime
; 그건 잘못이야
날짜 열은 다음 DateTime
과 같이 설정됩니다 .
new DataColumn("myDate", Type.GetType("System.DateTime"))
질문
이것을 코드로 해결할 수 있습니까? 아니면 데이터베이스 수준에서 무언가를 변경해야합니까?
답변
칼럼에 어떤 종류의 날짜가 있습니까?
그것들 모두 유형의 범위에 맞습니까?
제쳐두고, 생성자 를 위해 Type
객체 를 얻는 올바른 방법 DataColumn
은 typeof
키워드입니다.
따라서 열을 만들려면 다음을 작성해야합니다.
new DataColumn("myDate", typeof(DateTime))
답변
필드가 NULL 값을 허용하지 않을 때 DateTime 필드에 값을 지정하지 않으면 이런 일이 발생할 수 있습니다 .
그것은 나를 위해 그것을 고쳤다!
답변
DATETIME
및 .NET에서 모두 DATETIME2
매핑 System.DateTime
-실제로는 .NET 유형과 동일하므로 실제로 “변환”을 수행 할 수 없습니다.
MSDN 문서 페이지를 참조하십시오. http://msdn.microsoft.com/en-us/library/bb675168.aspx
이 두 가지에 대해 ” SqlDbType
” 에는 두 가지 값 이 있습니다. DataColumn
정의 에서 값을 지정할 수 있습니까?
그러나 SQL Server에서 지원되는 날짜 범위는 상당히 다릅니다.
DATETIME
1753/1/1 ~ “영원”(9999/12/31)을 DATETIME2
지원하고 0001/1/1 ~ 영원 을 지원합니다.
따라서 실제로해야 할 일은 날짜의 연도를 확인하는 것입니다 .1753 이전 인 경우 DATETIME
SQL Server 의 열이 처리 할 수 있도록 1753 이후로 변경해야 합니다.
마크
답변
내 SQL Server 2008 데이터베이스에서 DateTime
열을 nullable로 표시하지 않지만 GetDate()
함수를 기본값으로 표시했습니다. EF4를 사용하여 새 객체를 삽입 할 때 객체에 DateTime 속성을 명시 적으로 전달하지 않았기 때문에이 오류가 발생했습니다. SQL 함수가 날짜를 처리 할 것으로 예상했지만 그렇지 않았습니다. 내 솔루션은 데이터베이스에 의존하지 않고 코드에서 날짜 값을 보내서 생성하는 것이 었습니다.
obj.DateProperty = DateTime.now; // C#
답변
나를 위해 날짜 시간이 되었기 때문에 ..
01/01/0001 00:00:00
이 경우에는 FirstYearRegistered 코드를 예로 사용하여 EF DateTime Object에 null을 할당하려고합니다.
DateTime FirstYearRegistered = Convert.ToDateTime(Collection["FirstYearRegistered"]);
if (FirstYearRegistered != DateTime.MinValue)
{
vehicleData.DateFirstReg = FirstYearRegistered;
}
답변
이것은 나를 미치게했다. nullable 날짜 시간 ( DateTime?
)을 사용하지 않으려 고했습니다 . SQL Server 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;
}
}
}
}
}
}
답변
때때로 EF는 이것이 계산 된 열 이나 트리거를 처리하는지 알지 못합니다 . 의도적으로 이러한 작업은 삽입 후 EF 외부의 값을 설정합니다.
수정은 속성 에서 해당 열의 Computed
EF 로 지정하는 것 입니다 .edmx
StoreGeneratedPattern
나를 위해 열에 현재 날짜와 시간을 삽입 한 트리거가 있었을 때였습니다. 세 번째 섹션의 아래를 참조하십시오.
해결 단계
Visual Studio에서 Model Browser
페이지를 연 Model
다음 Entity Types
->
- 엔티티 및 날짜 시간 특성을 선택하십시오.
- 고르다
StoreGeneratedPattern
- 로 설정
Computed
이 상황에서 다른 답변은 해결 방법입니다. 열의 목적 상 레코드를 만들 때 지정된 시간 / 날짜를 지정하는 것입니다. 이는 올바른 시간을 추가하기 위해 트리거를 실행하는 SQL의 작업입니다. 이 SQL 트리거와 같은 :
DEFAULT (GETDATE()) FOR [DateCreated]
.