2014-04-30 6 views
2

to_char(date, format)과 같이 C#에서 오라클 날짜 형식을 사용하고 싶습니다. 데이터베이스 연결이나 자체 형식 인터프리터 작성이 필요하지 않습니다.ODP.NET : 오라클 날짜 형식을 "출력 전용"형식으로

샘플 응용 프로그램 (내가 .NET에 대한 오라클 데이터 공급자를 사용하고 있습니다) :

namespace OracleDateToCharTest 
{ 
    using System; 
    using Oracle.DataAccess.Client; 
    using Oracle.DataAccess.Types; 

    class Program 
    { 

     /// <param name="fmt"> Oracle-like format string. </param> 
     public static string OracleDateToChar(DateTime date, string fmt) 
     { 
      //// preparing format for ToString() 
      OracleGlobalization og = OracleGlobalization.GetThreadInfo(); 
      string prevFormat = og.DateFormat; 
      og.DateFormat = fmt; 

      try 
      { 
       //// converting to OracleDate 
       OracleDate odacDate = new OracleDate(date); 
       //// setting format for ToString() 
       OracleGlobalization.SetThreadInfo(og); 
       return odacDate.ToString(); 
      } 
      catch (OracleTypeException ex) 
      { 
       if (ex.Number == 1820) 
       { 
        //// described issue 
       } 
       throw; 
      } 
      finally 
      { 
       og.DateFormat = prevFormat; 
       OracleGlobalization.SetThreadInfo(og); 
      } 
     } 

     static void Main(string[] args) 
     { 
      var x = OracleDateToChar(DateTime.Now, "mm-dd-yyyy"); 
      var y = OracleDateToChar(DateTime.Now, "mm-dd-yyyy HH24:Mi:ss"); 
      var z = OracleDateToChar(DateTime.Now, "IW"); //// exception 
     } 
    } 
} 

그것은 "mm-dd-yyyy" 같은 형식 "mm-dd-yyyy HH24:Mi:ss" 잘 작동하지만, 불행하게도 그것은 "출력 전용"형식 작동하지 않습니다 "IW" (출력 전용 형식은 표 9-4에 따라 TO * _DATETIME 함수에서 http://docs.oracle.com/cd/B28359_01/olap.111/b28126/dml_commands_1029.htm에 지정할 수있는 형식입니다. 내가 예를

OracleDateToChar(DateTime.Now, "IW") 

을 요구하는 경우

나는 ToString() 라인에 ORA-01820 format code cannot appear in date input format 예외를 얻을.

ToDate() 메서드에서이 오류가 발생했는지 알 수 있지만 ToString()은 ODP.NET의 버그 인 것 같습니다.

질문 : 출력 전용 형식을 처리 할 수있는 OracleDateToChar 메서드를 구현하는 방법이 있습니까? (오라클 데이터베이스에서 select to_char(:date, :fmt) from nvl;을 호출하는 것이 옵션이 아니라고 가정)

답변

1

오라클 설명서에 대한 요점은 오라클 언어의 일부인 DATE_FORMAT에 적용된다는 것입니다. 그러므로 을 PL/SQL 문으로 만 실행할 수 있습니다. 클라이언트 측에서이 작업을 수행 할 수없는 이유는 다음과 같습니다. IW은 아는 한 ODP.Net 세계화를위한 유효한 형식 마스크가 아닙니다. 실제로 ODP 세계화 DateFormat의 기본값은 NLS_DATE_FORMAT인데 전체 날짜 형식 문자열이며 IW은 날짜 자체를 포맷하는 것이 아니라 주를 얻는 것입니다. 내가 아는 한 .Net 프레임 워크의 어떤 것도 오라클 특정 문자열을 인식하지 못합니다. 따라서 작동시키기 위해서는 오라클에 명령을 내리고 그 결과를 다시 가져와야합니다. 예를 들면 다음과 같습니다.

CONSIDER mydatetime 
DATE_FORMAT MON-RRRR-DD-HH24 

날짜 형식을 변경하는 것은 과도한 것처럼 보입니다. 또한

반환 값은 문자열입니다 오라클 날짜 구조 (OracleDate) ToString() method 노트

오라클 문서를 읽기 클라이언트 측 닷넷 in this SO answer

몇 가지 좋은 대안 siggestions이 있습니다 스레드의 에 의해 지정된 형식의 OracleDate 표현 OracleGlobalization.DateFormat 특성

(필자 강조). 이에 대한 정의는 found here 일 수 있습니다. NLS_DATE_FORMAT, 따라서 확장자가 OracleDate.ToString 인 유용한 형식 문자열 목록은 found here이 될 수 있습니다.

+0

그러나 ODP.NET (Oracle에서 개발)은 .NET 형식이 아닌 Oracle 형식을 사용합니다.따라서 "IW"가 어떻게 든 지원되어야합니다. 특정 날짜를 가리키는 것이 아니기 때문에 "IW"형식으로 날짜를 변환하는 것은 불가능하다는 것을 이해합니다. 그러나 목표는 'oracle.ToString ("IW")'(형식 지정)과 같은 일을하는 것입니다. "IW"형식의 날짜 문자열 표현을 얻으려면 (불행히도 ODP에는 그런 방법이 없기 때문에'OracleGlobalization'을 사용하려고했습니다). 그리고 사용자가 제공하는 "허용 된 형식 문자열"과의 연결에는 "인기있는 문자열"만 나열됩니다. 제 질문은 인기있는 것뿐만 아니라 모든 것에 관한 것입니다. – Bru

+0

"IW"는 지원되지 않는 형식의 예입니다. 나는 원래의 질문에서 그들을 식별하는 방법을 언급했다. – Bru

+0

'OracleDate' 구조가 데이터베이스에서 검색된 Oracle DATE 데이터 유형을 표현하기 때문에 실제로는 아닙니다. 'IW'로 포맷 된 날짜를'DATE' 필드에 저장할 수 없으므로 출력 만됩니다. 이것이 이것이 NLS_DATE_FORMAT에서 허용되는 것과 관련이있는 이유입니다. 이것은 .Net 형식 문자열이 아니라 Oracle이 날짜 객체를 구현 한 방법입니다. 실망 스럽다는 것을 알고 있습니다 - ODP는 내가 기억하는 것보다 더 많은 두통을 유발했습니다. 왜 그물을 사용하지 않는가? 너를 막을 방법이 있니? –