오류 - SqlDateTime 오버플로입니다.1/1/1753 오전 12:00 ~ 12/31/9999 오후 11:59:59 사이여야 합니다.
저는 제가 작성한 이 코드를 사용해왔고 그것은 가장 불분명한 방식으로 작동하고 있습니다.Database에 DateTime 열 두 개가 포함된 행을 삽입하려고 합니다.
myrow.ApprovalDate = DateTime.Now
myrow.ProposedDate = DateTime.Now
그러나 데이터베이스를 업데이트할 때 다음 오류가 발생합니다.
SqlDateTime 오버플로입니다.1/1/1753 오전 12:00 ~ 12/31/9999 오후 11:59:59 사이여야 합니다.
데이터베이스에서 삽입된 값을 복사하여 업데이트 중인 개체에 하드 코드화하기도 했습니다.
// I copied this value from the DB
myrow.ApprovalDate = Convert.ToDateTime("2008-12-24 00:00:00.000");
여전히 동일한 오류입니다. 이상한 부분은 위의 트릭이 DB에 대한 첫 번째 삽입에 효과가 있었지만 그 이후로 실패했다는 것입니다.무슨 일인지 아십니까?
A DateTime
C#의 값 형식은 참조 형식이 아니므로 null일 수 없습니다. 그나러일상수있습다니수▁▁the다니있이 될 수 있습니다.DateTime.MinValue
서버s 를 .DATETIME
데이터 형식
값 유형은 항상 명시적으로 설정할 필요 없이(이 경우 DateTime) 항상 (기본값) 값(0)을 갖도록 보장됩니다.최소값).
결론적으로 데이터베이스에 전달하려는 DateTime 값이 설정되지 않은 것 같습니다.
DateTime.MinValue = 1/1/0001 12:00:00 AM
DateTime.MaxValue = 23:59:59.9999999, December 31, 9999,
exactly one 100-nanosecond tick
before 00:00:00, January 1, 10000
SQL 서버 정보
datetime 시간
1753년 1월 1일부터 9999년 12월 31일까지의 날짜 및 시간 데이터는 1/300초의 정확도(3.33밀리초 또는 0.0033초에 해당)입니다.은 0 0.007초 단위로 .000, .003 는 .007 또 단 반 됩 니 림 다올위로초값00다▁values데이트
1900년 1월 1일부터 2079년 6월 6일까지 정확한 날짜 및 시간 데이터입니다. 29.998초 이하의 작은 날짜 시간 값은 가장 가까운 분으로 반올림되고 29.999초 이상의 값은 가장 가까운 분으로 반올림됩니다.
마지막으로, 만약 당신이 C#를 통과하는 자신을 발견한다면.DateTime
최대 정밀도를 유지하고 sql 서버가 유사한 오류를 발생시키지 않도록 하려면 sql에 대한 문자열 형식을 다음과 같이 지정해야 합니다.
string sqlTimeAsString = myDateTime.ToString("yyyy-MM-ddTHH:mm:ss.fff");
업데이트(8년 후)
sql ▁sql다를 사용하는 것을 .DateTime2
.net과 더 잘 DateTime
범위가 짜날범 로위로인 경우0001-01-01 through 9999-12-31
범위 및 간 시 위 범00:00:00 through 23:59:59.9999999
string dateTime2String = myDateTime.ToString("yyyy-MM-ddTHH:mm:ss.fffffff");
DB 관련 오류가 많이 발생한 후 SQL 최소/최대 날짜에 다음을 사용하는 것이 매우 효과적입니다.
DateTime rngMin = (DateTime)System.Data.SqlTypes.SqlDateTime.MinValue;
DateTime rngMax = (DateTime)System.Data.SqlTypes.SqlDateTime.MaxValue;
를 비교할 때 주의하십시오.Net DateTime to SqlDateTime.최소값 또는 최대값.예를 들어, 다음은 예외를 발생시킵니다.
DateTime dte = new DateTime(1000, 1, 1);
if (dte >= SqlDateTime.MinValue)
//do something
그 이유는 MinValue가 DateTime이 아닌 SqlDateTime을 반환하기 때문입니다.따라서 .Net은 비교를 위해 SqlDateTime으로 변환하려고 하지만 허용 가능한 SqlDateTime 범위를 벗어났기 때문에 예외를 던집니다.
이에 대한 한 가지 해결책은 DateTime을 SqlDateTime과 비교하는 것입니다.최소값.가치.
DateTime 유형의 변수를 null로 설정하려는 경우 이 오류가 발생합니다.변수를 null로 선언합니다(예: DateTime?).이것으로 문제가 해결될 것입니다.
두 열의 코드는 괜찮아 보입니다.해당 매핑 클래스에서 다른 날짜/시간 열을 찾습니다.또한 쿼리 및 매개 변수를 보려면 데이터 컨텍스트에서 로깅을 사용 가능으로 설정합니다.
dc.Log = Console.Out;
DateTime이 c#의 0(0001-01-01)으로 초기화됩니다.이 메시지는 linqtosql을 통해 sql 문자열 리터럴 '0001-01-01'을 통해 데이터베이스로 전송됩니다.Sql은 이 날짜 이후의 T-Sql 날짜 시간을 구문 분석할 수 없습니다.
이 문제를 해결하는 몇 가지 방법이 있습니다.
- SQL이 처리할 수 있는 값으로 모든 날짜 시간을 초기화해야 합니다(예: Sql의 0: 1900-01-01).
- 때때로 생략될 수 있는 날짜 시간이 null일 수 있는지 확인합니다.
즉, 일반적으로 원하는 값 대신 null이 쿼리에 게시된다는 의미입니다. SQL Profiler를 실행하여 linq에서 SQL Server로 전달되는 내용을 정확히 확인할 수 있습니다.
을 때로코 적쓰게를위기 SQL 서날짜설, 와간및 ID 때때다로 하여 삽입 시가 날짜,, 하는 데 .GETDATE()
또는NEWID()
.
이러한 경우 엔티티 클래스에 있는 필드의 자동 생성 값 속성을 true로 설정해야 합니다.
이렇게 하면 코드에서 값을 설정할 필요가 없으며(에너지 소비를 방지합니다!!!) 절대로 예외를 볼 수 없습니다.
확장 방법 사용
public static object ToSafeDbDateDBnull(this object objectstring)
{
try
{
if ((DateTime)objectstring >= SqlDateTime.MinValue)
{
return objectstring;
}
else
{
return DBNull.Value;
}
}
catch (Exception)
{
return DBNull.Value;
}
}
DateTime objdte = new DateTime(1000, 1, 1);
dte.ToSafeDbDateDBnull();
Datetime처럼 Datetime 하면 null을 합니다.DateTime?
당신의 모델에서는 예외를 두지 않습니다.
저는 제 경우에 이렇게 문제를 해결했습니다.
일반적으로 DateTime 변환 또는 구문 분석을 수행할 때 이러한 오류가 발생합니다.응용프로그램이 호스트되는 서버의 일정관리 설정(주로 표준시 및 짧은 날짜 형식)을 확인하고 위치에 대한 올바른 표준시로 설정되었는지 확인합니다.이것으로 문제가 해결되기를 바랍니다.
저도 같은 것을 보고 있습니다.행 삽입 시 오류가 발생하지 않고 업데이트 시 오류가 발생합니다.내가 참조하는 테이블에는 두 개의 DateTime 열이 있는데 둘 다 null이 아닙니다.
시나리오를 요약하면 행을 가져와서 즉시 저장할 수 있습니다(데이터 변경 없음).get은 정상적으로 작동하지만 업데이트는 실패합니다.
우리는 NHibernate 3.3.1.4000을 사용하고 있습니다.
NHibernate를 사용하는 경우 매핑에서 null인 해당 DateTime 속성이 null로 설정되어 있는지 확인합니다.
나의 경우 테이블 날짜 열이 null일 수 없기 때문에 이 오류가 발생했습니다.
아래와 같이:
Create Table #TempTable(
...
ApprovalDate datatime not null.
...)
이 오류를 방지하려면 null로 설정합니다.
Create Table #TempTable(
...
ApprovalDate datatime null.
...)
db 열 유형을 다음으로 변경합니다.datetime2
쿼리/명령 생성자에 추가합니다.
SqlMapper.AddTypeMap(typeof(DateTime), System.Data.DbType.DateTime2);
DateTime이 있는 모델이 있었지만 데이터베이스 테이블 열에 Null DateTime이 필요했습니다.
모델을 DB에 삽입할 때 ORM이 빈 필드를 제공하여 SQL Server에서 SqlDateTime 오버플로 예외를 발생시켰습니다.해결책은 모델 DateTime 필드를 null로 만들어 ORM이 필드를 삽입하고 아무것도 없을 때 빈 필드 대신 DBNull 값을 제공하는 것입니다.
상황에 따라 Dapper ORM을 사용하던 중 이 문제가 발생했습니다.
날짜 시간.최소 값 및 날짜 시간.최대값
DateTime.MinValue = 1/1/0001 12:00:00 AM
DateTime.MaxValue = 23:59:59.9999999, December 31, 9999,
exactly one 100-nanosecond tick
before 00:00:00, January 1, 10000
언급URL : https://stackoverflow.com/questions/468045/error-sqldatetime-overflow-must-be-between-1-1-1753-120000-am-and-12-31-999
'programing' 카테고리의 다른 글
Rspec의 should_raise를 예외적으로 사용하는 방법은 무엇입니까? (0) | 2023.06.03 |
---|---|
UITableView beginUpdates/endUpdates에서 애니메이션이 종료되었음을 감지하는 방법은 무엇입니까? (0) | 2023.06.03 |
조건부 서식 - 하나의 열을 기준으로 전체 행의 색 축척 (0) | 2023.05.29 |
Angular 2에서 다시 로드하지 않고 경로 매개변수 변경 (0) | 2023.05.29 |
Git: "당신이 누구인지 말해주세요" 오류 (0) | 2023.05.29 |