2012-06-20 5 views
2

내가 오라클의 날짜 필드에 maxdate 삽입 :odp.net DateTime.MaxDate

using (OracleCommand Cmd = new OracleCommand("insert into test (mydate) values (:mydate)", OracleConnection)) 
{ 
    Cmd.Parameters.Add(new OracleParameter(":mydate", DateTime.MaxValue)); 
    Cmd.ExecuteNonQuery(); 
} 

을 그리고 값을 검색하려고 :

using (OracleCommand Cmd = new OracleCommand("select mydate from test where mydate=:mydate", OracleConnection)) 
{ 
    Cmd.Parameters.Add(new OracleParameter(":mydate", DateTime.MaxValue)); 
    object MyDate = Cmd.ExecuteScalar(); 
} 

MyDate가 객체가 null 유지합니다. 다시 말해서 기록을 읽을 수 없다는 뜻입니다. 이거 버그 야? 어딘가에 반올림 불일치가 있습니까?

+0

"DateTime.MaxValue"보다 오라클의 최대 날짜 값이 일찍 있습니까? – bluevector

+0

좋아요,하지만 select와 insert에 똑같은 매개 변수를 사용합니다. – broersa

+0

그것은 MaxValue와 관련이 있습니다. 새 DateTime (2999,1,1)이 작동합니다. 나는 다른 날짜를 디폴트로 사용할 것이라고 생각한다. 감사. – broersa

답변

1

데이터베이스의 DateDateTime.MaxValue과 다르므로
동일한 데이터 유형이나 동일한 정밀도가 아닙니다.

OracleCommand Cmd = new OracleCommand("select dump(mydate), dump(:mydate) from test where rownum=1", OracleConnection) 

결과이 같은 것입니다 :

이 쿼리

dump(mydate): Typ=12 Len=7: 199,199,12,31,24,60,60 
dump(:mydate): Typ=180 Len=11: 199,199,12,31,24,60,60,59,154,201,156 

이것은 DB의 값이 유형 Date이며 초하지만 millisecondas 시간을 포함하고 있음을 의미 반면 매개 변수는 밀리 초를 보유하는 timestamp 데이터 유형으로 변환됩니다. 당신이 그것을 사용하려는 경우

그래서, 당신의 where clause 다음과 같이 그것을 시도 :이뿐만 아니라

1

을 초를 잘라 것

using (OracleCommand Cmd = new OracleCommand("select mydate from test where trunc(mydate, 'mi') = trunc(:mydate, 'mi')", OracleConnection)) 
     { 
      Cmd.Parameters.Add(new OracleParameter(":mydate", DateTime.MaxValue)); 
      object MyDate = Cmd.ExecuteScalar(); 
     } 

참고가 오라클에 C#을에서 DateTime.MaxValue을 통과하는 경우 timestamp 매개 변수라고 가정 해 보겠습니다. 값은 10000/01/01/ 00:00:00 연도 : 10000 (예, 만, 오타가 아닙니다.)입니다. 나는 이것이 C#과 오라클 OLEDB 공급자 사이의 버그라고 생각한다.

대부분 삽입 및 삽입시 예외가 발생한다. 연도 값을 확인하려면 다음 식을 사용하십시오. EXTRACT (YEAR FROM CAST(yourparameter AS DATE))

행운을 빈다!

+0

Entity Framework를 사용할 때 유용한 정보가 있습니까? – k4st0r42