如果日期格式不是美国日期格式,则 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
英国/法语 dd/mm/yy
德语 dd mm
意大利语 dd-mm-yy
日本 yy/mm/dd
台湾 yy/mm/dd
特区 mm-年月日
MDY mm/dd/yy
DMY dd/mm/yy
YMD yy/mm/dd
SHORT 由 Windows 控制面板短日期设置确定的短日期格式。
大量 由 Windows 控制面板长日期设置确定的长日期格式。

再现行为的步骤

  1. 使用以下代码创建名为 Odbctest的程序文件:

    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. 重新运行程序并观察数据返回并显示在屏幕上。