DBF dBase-Where子句日期运算符/操作数类型不匹配错误

时间:2018-07-26 11:51:49

标签: c# date dbf

尝试在dbf dBase上执行查询,该查询包含一个where子句,仅选择日期在01/01/2018之后的行

我尝试了该线程中的所有选项,但无济于事。 how to query DBF(dbase) files date type field in where and between clause

command.CommandText = string.Format(@"SELECT * FROM PAYHIST WHERE EMPLOYEE = '{0}' 
                                            AND PAY_DATE >= '#1/1/2018 12:00:00 AM#'", employee.WorksNumber);

这将引发“运算符/操作数类型不匹配”。

between( [PAY_DATE], CTOT( "01-Jan-18 12:00:00 AM" ), CTOT( "31-Dec-18 12:00:00 AM" ))

between( [PAY_DATE], CTOT( '01 - Jan - 18 12:00:00 AM' ), CTOT( '31 - Dec - 18 12:00:00 AM' )) 

同时

AND PAY_DATE >= {^2018-01-01}

PAY_DATE >= {D ‘2018-01-01’}

引发输入字符串错误。

我正在VS2015上运行它

任何建议都将受到欢迎。

1 个答案:

答案 0 :(得分:1)

查询时,您需要参数化查询,而不是将其作为字符串嵌入。 OleDB命令执行过程将为您处理数据类型。但是请注意,针对基于.DBF的文件的OleDb参数使用“?”作为参数的占位符,并且需要为每个所需的参数添加到命令中...

>>> myList = [('1', '1')]
>>>
>>> myList[:0] = dict({'All': 'All'}).items()
>>> myList
[('All', 'All'), ('1', '1')]
>>>

如果在两者之间进行操作,则只剩下多余的“?”占位符

command.CommandText = string.Format(
@"SELECT 
        PH.* 
    FROM 
        PAYHIST PH
    WHERE 
            PH.EMPLOYEE = ?
        AND PH.PAY_DATE >= ? ";

    command.Parameters.AddWithValue( "parmForEmployeeID", employee.WorksNumber );
    command.Parameters.AddWithValue( "parmForDateField", new date(2018,1,1) );

关于参数化查询的示例很多,尤其是基于Web的示例,以防止SQL注入。 -并继续阅读。