2012-04-25 3 views
1

쿼리 및 informix 데이터베이스가있는 .aspx 페이지가 있습니다. 이 쿼리는 ODBC 연결을 통해 수행되며 데이터 테이블에 저장됩니다. 그런 다음이 데이터 테이블은 라디오 버튼 그룹의 데이터 소스로 사용됩니다.Informix ODBC 쿼리가 날짜 필드에 시간을 추가합니다.

제 문제는 어떤 이유로 든 라디오 버튼에 시간이 "12:00:00 AM"으로 추가된다는 것입니다. informix 필드가 시간을 포함하지 않는 날짜 필드이기 때문에 이것은 이상합니다. 웹 페이지 외부에서 쿼리를 실행하면 시간이없이 반환됩니다 ... "2012-06-15"

그래서 요약하면 ... "6/15/2012 12 : 00 : 00 오전 다음과 같이 2012년 6월 15일 "

쿼리는"무엇을 내가 원하는 것은 "

"select DATE(attend_date) as attend_date from soar_major_table where major =? and active<>'N'" 

생성하는 코드 데이터 테이블 :

string connString; 
      connString = ConfigurationManager.ConnectionStrings [ "ERP" ].ConnectionString; 


      OdbcConnection conn = new OdbcConnection (); 
      conn.ConnectionString = connString; 


      string sql = "select DATE(attend_date) as attend_date from soar_major_table where major =? and active<>'N' "; 

OdbcCommand command = new OdbcCommand (); 
      command.CommandText = sql; 
      command.Parameters.Add (new OdbcParameter ("major", major)); 
      command.Connection = conn; 

      DataTable dt = new DataTable (); 


      OdbcDataAdapter dataAdapter = new OdbcDataAdapter (); 


      dataAdapter.SelectCommand = command; 


      try 
      { 

       conn.Open (); 


       dataAdapter.Fill (dt); 
      } 
      finally 
      { 
       if (conn != null && conn.State == ConnectionState.Open) 
       { 

        command.Dispose (); 
        dataAdapter.Dispose (); 
        conn.Close (); 
       } 
      } 

      return dt; 

그리고 마지막으로 라디오 btn 그룹의 인구 :

if (dt.Rows.Count > 0) 
       { 
        rdoDate.DataSource = dt; 

        rdoDate.DataTextField = "attend_date"; 
        rdoDate.DataValueField = "attend_date"; 
        rdoDate.DataBind (); 

       } 

답변

1

문제는 Informix 데이터 서버의 업스트림입니다.

당신은 실행하면 :

SELECT DATE(attend_date) ... 

서버가 1899년 12월 31일 이후의 일 수를 나타내는 4 바이트 정수 (그래서 1900-01-01 하루 1이었다)로 그 값을 반환합니다, 이는 Informix에서 DATE의 내부 표현입니다.

상위 계층의 어떤 것이 '날짜 + 시간'값으로 간주하고 자정이라고 가정하면 날짜에 시간 구성 요소가 없으므로 시간이며 오전에 서식을 지정하여 상처에 소금을 문지르고 있습니다./pm 표기법.

여기에는 클라이언트 측 추적이 포함됩니다. ODBC 드라이버에 대한 지식이 부족한 것을 제외하고는 의심의 여지가 있습니다. 문제는 ODBC 드라이버가 아니라 .NET 계층에서 발생합니다. 그러나 일단 ODBC 계층 위에 있으면 내 전문 분야를 벗어납니다 (ODBC에 대한 훌륭한 전문 지식을 주장하지 않습니다).

있습니다 (Windows 용 Setnet32를 함께이 부분을 설정해야 할 수도 있습니다) 환경에서 SQLIDEBUG=2:xyz를 사용하여 클라이언트 코드로 문제를 분리 할 수 ​​있습니다. Windows에서 작동하는 경우 (Unix에서는) xyz_이라는 이름의 파일과 다양한 숫자 및 문자 그룹이 이어집니다. 이 파일은 sqliprint으로 분석 할 수 있으며 Informix 데이터 서버로 보낸 내용을 보여주고 클라이언트로 반환합니다. 서버로가는 도중에 SQL이 해킹되지 않았다고 가정하면 간단한 날짜로 반환 된 날짜를 볼 수 있습니다. 문제는 확실히 클라이언트 쪽입니다. SQL이 도중에 해킹 당하면 클라이언트 쪽 문제가 발생합니다.

최소한 디버깅을위한 시작점을 제공합니다.

코드에서 사용중인 유형의 데이터 유형을주의 깊게 살펴보십시오. 특히, 일부 DBMS에는 시간 정보가 포함 된 DATE 유형이 있으므로 이러한 해석을 피할 필요가 있습니다. SQL 표준에는 DATE (시간 없음), TIME (날짜 없음) 및 TIMESTAMP (날짜 및 시간) 유형이 있습니다.

+0

귀하의 진단이 맞습니다. 나는'DATE()'로 간단한 SQL 쿼리를 테스트했는데 ODBC 드라이버 버전 인 것 같다. 3.70TC1은 맞습니다. 나는 날짜 만 보았습니다. –

관련 문제