共用方式為


Visual FoxPro ODBC Driver 查詢失敗若日期格式不是美國日期格式

本文幫助您解決使用 Visual FoxPro ODBC 驅動程式在 Visual FoxPro 表格上執行 ODBC 查詢時所發生的問題。

原始產品版本: Visual FoxPro
原始 KB 編號: 229854

癥狀

使用 Visual FoxPro ODBC 驅動程式對 Visual FoxPro 表格執行 ODBC 查詢時,如果 WHERE 子句中包含的日期不是美國日期格式,則不會返回任何記錄。

原因

Visual FoxPro ODBC 驅動程式僅接受採用嚴格美式日期格式的日期。

解析度

將傳遞至 SELECT-SQL 語句 WHERE 子句中的日期轉換為美式日期格式。

狀態

這種行為是設計使然。

詳細資訊

Visual FoxPro 的預設日期設定為 AMERICAN。 不過,日期格式可以設置為以下格式:

日期設定 日期格式
美國人 mm/dd/yy
ANSI(美國國家標準學會) yy.mm.dd
英國/法國 dd/mm/yy
德文 dd.mm.yy
意大利语 dd-mm-yy
日本 yyyy/mm/dd
臺灣 yyyy/mm/dd
美國 mm-dd-yy
MDY mm/dd/yy
DMY dd/mm/yy
YMD yyyy/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. 請重新執行該程式,並觀察資料被返回且顯示在螢幕上。