代码之家  ›  专栏  ›  技术社区  ›  Mawg says reinstate Monica

Sqlite自动时间戳-插入,然后在DB感知网格上显示

  •  0
  • Mawg says reinstate Monica  · 技术社区  · 9 年前

    我对MySql有一些经验,我是第一次搬到Sqlite。

    这个 Sqlite documentation for data types ,第1.2节规定

    SQLite没有用于存储日期的存储类 和/或时间。相反,SQLite的内置日期和时间函数 能够将日期和时间存储为TEXT、REAL或INTEGER 价值观

    我更喜欢自动时间戳,但如果它能让我的代码正常工作,我会忍受每次都要传递它。

    以下内容 this question ,我已将我的字段声明为

    `time_stamp` TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL, 
    

    然而,它没有在DB ware网格上显示任何内容。

    我添加了一个 OnDrawCell() 并认为这可能会有所帮助:

       var cellText : String;
           cellValue : String;
           dateTime : TDateTime;
    begin
       if ARow = 0 then
          Exit;
    
          cellValue := myGrid.Cells[ACol, ARow];
    
       case ACol of
          0: ; // invisibe column, do nothing
          1: cellText := cellValue;
          2: begin
                dateTime := StrToDateTime(cellValue);
                cellText := DateTimeToStr(dateTime);
             end;
          3: cellText := cellValue;
          4: cellText := cellValue;
       end;
    
       myGrid.Canvas.FillRect(Rect);
       myGrid.Canvas.TextOut(Rect.Left + 2, Rect.Top + 2, cellText);
    

    其中第2列是我的时间戳,但显然是空的。

    所以,我的问题是,有人能纠正这个代码片段吗,或者向我展示一个代码示例,说明如何声明默认为当前时间戳的Sqlite列,以及如何在DB感知网格中显示该列?如果有帮助的话,我很乐意存储Unix时间戳。

    顺便说一下,我使用的是XE7,FireDac和TMS TAdvDbGrid。


    [更新]正如下面的一个评论线程所提到的(也许应该是最初提到的),在本例中,我使用 TDateTime IncSecond(startTime, delay * i) 因此,实际上,我正在向该字段写入一个TDateTime,然后关闭/打开数据源,显示新行的所有其他字段,但不显示该字段。

    但是,这实际上偏离了我最初的“请提供示例”问题,并将其转化为“请修复我的代码”问题。任何一个答案都会让我很高兴。

    1 回复  |  直到 7 年前
        1
  •  1
  •   crefird    9 年前

    你找错地方了,你的问题在数据集中。对于从外部数据库获取数据的所有数据集来说,这是一个常见问题。

    您的查询/数据集在数据库中有数据的副本。当数据库打开或您使用它更新/插入记录到数据库时,它会从数据库中获取该副本。如果数据库中的数据以其他方式更改,则在重新读取更改的记录之前,数据集不会发生这些更改。这适用于您,因为时间戳值是在数据库中设置的,而不是通过数据集设置的。这可以通过关闭然后打开数据集来实现。

    使用FireDAC,尝试设置查询的 UpdateOptions .RefreshMode := rmAll 当查询中只有一个表,即没有联接时,它对我有效。