如果日期格式不是美国日期格式,Visual FoxPro ODBC 驱动程序查询将失败

本文可帮助你解决在使用 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 日期设置为“美国”。 但是,日期格式可以设置为以下格式:

日期设置 Date Format
美国 mm/dd/yy
Ansi yy.mm.dd
BRITISH/FRENCH 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
SHORT 短日期格式由 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. 重新运行程序,并观察数据是否返回并显示在屏幕上。