날짜 형식이 AMERICAN 날짜 형식이 아닌 경우 Visual FoxPro ODBC 드라이버 쿼리가 실패합니다.

이 문서는 Visual FoxPro ODBC 드라이버를 사용하여 Visual FoxPro 테이블에 대해 ODBC 쿼리를 실행할 때 발생하는 문제를 resolve 데 도움이 됩니다.

원래 제품 버전: Visual FoxPro
원래 KB 번호: 229854

증상

Visual FoxPro ODBC 드라이버를 사용하여 Visual FoxPro 테이블에 대해 ODBC 쿼리를 실행하는 경우 WHERE 절에 AMERICAN 날짜 형식이 아닌 날짜가 포함되어 있으면 레코드가 반환되지 않습니다.

원인

Visual FoxPro ODBC 드라이버는 엄격한 미국 날짜 형식의 날짜만 허용합니다.

해결 방법

SELECT-SQL 문의 WHERE 절에 전달된 날짜를 AMERICAN 날짜 형식으로 변환합니다.

상태

이것은 의도적으로 설계된 동작입니다.

추가 정보

기본 Visual FoxPro 날짜 설정은 AMERICAN입니다. 그러나 날짜 형식은 다음 형식으로 설정될 수 있습니다.

날짜 설정 날짜 형식
미국 mm/dd/yy
Ansi yy.mm.dd
영국/프랑스어 dd/mm/yy
독일어 dd.mm.yy
이탈리아어 dd-mm-yy
일본 yy/mm/dd
대만 yy/mm/dd
미국 mm-dd-yy
MDY mm/dd/yy
Dmy dd/mm/yy
YMD yy/mm/dd
짧은 Windows 제어판 짧은 날짜 설정에 의해 결정되는 짧은 날짜 형식입니다.
Windows 제어판 긴 날짜 설정에 의해 결정되는 긴 날짜 형식입니다.

동작을 재현하는 단계

  1. 다음 코드를 사용하여 Odbctest.prg라는 프로그램 파일을 만듭니다.

    CLEAR
    DO CASE
        CASE "6.0"$VERSION()
            lcConnStr="DRIVER={Microsoft Visual FoxPro Driver};" + ;
            "Exclusive=No;SourceType=DBF;SourceDB="+HOME(2)+"DATA"
        CASE "5.0"$VERSION()
            lcConnStr="DRIVER={Microsoft Visual FoxPro Driver};" + ;
            "Exclusive=No;SourceType=DBF;SourceDB="+HOME()+"SAMPLES\DATA"
        CASE "3.0"$VERSION()
            lcConnStr="DRIVER={Microsoft Visual FoxPro Driver};" + ;
            "Exclusive=No;SourceType=DBF;SourceDB="+HOME()+"SAMPLES\DATA"
            OTHERWISE && Version is VFP 7.0,8.0, or 9.0
            lcConnStr="DRIVER={Microsoft Visual FoxPro Driver};" + ;
            "Exclusive=No;SourceType=DBF;SourceDB="+HOME(2)+"DATA"
    ENDCASE
    
    *!* Create An ADO Connection
    
    oConnection=CREATEOBJECT("ADODB.Connection")
    oConnection.ConnectionString = lcConnStr
    oConnection.CursorLocation = 3
    oConnection.OPEN
    
    * lcSQL="SELECT * FROM ORDERS WHERE ORDER_DATE < {07/22/93}"
    lcSQL="SELECT * FROM ORDERS WHERE ORDER_DATE < {93/07/22}"*!* Create An ADO recordset
    rs=CREATEOBJECT("ADODB.Recordset")
    rs.activeconnection = oConnection
    rs.CursorLocation = 3
    rs.cursortype = 1
    rs.LockType = 3
    rs.OPEN(lcSQL)
    IF !rs.EOF
        rs.movefirst
        DO WHILE !rs.EOF
            ? rs.FIELDS(0).VALUE
            rs.movenext
        ENDDO
    ENDIF
    rs.CLOSE
    oConnection.CLOSE
    
  2. 레코드가 반환되거나 표시되지 않는지 확인합니다.

  3. 다음 코드 줄을 주석으로 표시합니다.

    lcSQL="SELECT * FROM ORDERS WHERE ORDER_DATE < {93/07/22}"
    
  4. 다음 코드 줄의 주석 처리를 제거합니다.

    lcSQL="SELECT * FROM ORDERS WHERE ORDER_DATE < {07/22/93}"
    
  5. 프로그램을 다시 실행하고 데이터가 반환되고 화면에 표시되는지 확인합니다.