为什么在TADOTable中使用日期/时间值的Locate()不起作用

时间:2018-02-02 12:15:19

标签: delphi delphi-7 ado

我正在开发一个用于记录用户活动的小型子系统。系统使用MS SQL Server作为数据库, Delphi7和ADO用于构建接口。

我遇到的问题是我无法找到具有特定日期/时间值的记录。

以下是问题的再现示例:

1。数据库:MS SQL Server 2005 Express Edition。

@Configuration
public class DataSourceConfig {

    private static final Logger logger = Logger.getLogger(DataSourceConfig.class);

    @Bean(destroyMethod = "")
    public DataSource dataSource() {

        DataSource dataSource = null;
        JndiTemplate jndi = new JndiTemplate();
        while (true)
            try {
                logger.info("Try to initialize datasource");
                dataSource = (DataSource) jndi.lookup("java:comp/env/jdbc/macmonitor_liquibase_mysql");
                break;
            } catch (NamingException e) {
                logger.error("Error while initializing datasource", e);
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e1) {
                    logger.error("Interupted exception in sleep method in datasource initialisation loop", e1);
                    return null;
                }
                continue;
            }
        logger.info("Datasource initialization success");
        return dataSource;
    }

    @Bean
    @Autowired
    public SpringLiquibase liquibase(DataSource dataSource) {
        SpringLiquibase liquibase = new SpringLiquibase();
        liquibase.setChangeLog("classpath:liquibase/db-changelog-master.xml");
        liquibase.setDataSource(dataSource);
        return liquibase;
        }
}

2。示例代码: Delphi 7和ADO

-- Table creation
CREATE TABLE [tlog] (
    [USERN] [numeric](10, 0) NULL,
    [USERDATE] [datetime] NULL,
    [LOGTEXT] [varchar](250) COLLATE Cyrillic_General_CS_AS NULL
);

-- Insert date/time value
INSERT INTO [tlog] (USERN, USERDATE, LOGTEXT)
VALUES (1, CURRENT_TIMESTAMP, 'Record current activity')
-- Insert date only value
INSERT INTO [tlog] (USERN, USERDATE, LOGTEXT)
VALUES (1, '02-02-2018', 'Record current activity')

-- Table's content
-------------------------------------------------------------
| USERN |       USERDATE          |          LOGTEXT        |
-------------------------------------------------------------
| 1     | 26/10/2015 17:13:36.597 | Record current activity |
-------------------------------------------------------------
| 1     | 02/02/2018 00:00:00.000 | Record current activity |
-------------------------------------------------------------

第3。预期结果:找到记录。

4。实际结果: TADOTable.Locate()返回FALSE。

我做错了什么以及如何将datetime值传递给TADOTable.Locate()方法?

提前致谢!

2 个答案:

答案 0 :(得分:1)

您几乎正确地使用了Locate。几乎是因为在搜索 TDateTime 值时,您所包含的loPartialKey选项毫无意义。在这种情况下,您需要搜索确切的日期时间值。问题出在你的测试中。

您的第一次测试的日期时间值错误。其转换中会忽略其毫秒部分,因此您实际上正在尝试查找日期时间 26/10/2015 17:13:36 ,这不在您的表格中。

在第二种情况下,您正试图找到日期时间 26/10/2015 17:13 ,这不在您的表格中。

我建议使用例如EncodeDateTime函数用于构建日期时间而不是字符串转换,并使用loPartialKey选项删除这些额外的调用。

答案 1 :(得分:0)

使用类型字符串以yyyy-mm-dd格式查找日期或日期

示例:

位于:

ExampleItem

其中:

pre_save