Sqlite 自动时间戳 - 插入然后显示在数据库感知网格上

Sqlite auto timestamp - insert then display on DB aware grid

我有一些使用 MySql 的经验,并且是第一次迁移到 Sqlite。

Sqlite documentation for data types,第 1.2 节指出

SQLite does not have a storage class set aside for storing dates and/or times. Instead, the built-in Date And Time Functions of SQLite are capable of storing dates and times as TEXT, REAL, or INTEGER values

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

Followinf 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 列以及如何在数据库感知网格中显示该列?如果有帮助的话,我很乐意存储一个 Unix 时间戳。

顺便说一句,我正在使用 XE7、FireDac 和 TMS TAdvDbGrid。


[更新] 正如下面的评论线程所提到的(也许最初应该提到),在这种情况下,我正在使用 TDateTime 和 [=14 生成一些用于测试鼠海豚的虚拟数据=].因此,实际上,我正在向该字段写入一个 TDateTime,然后我 close/open 显示数据源和新行的所有其他字段,但不显示那个字段。

但是,这实际上偏离了我最初的 "please provide an example" 问题,并将其变成了 "please fix my code" 问题。任何一个的答案都会让我很高兴。

您找错地方了,您的问题出在数据集中。这是所有从外部数据库获取数据的数据集的普遍问题。

您的 query/dataset 在您的数据库中有一份数据副本。当它打开时或当您使用它来将 update/insert 记录存入数据库时​​,它会从数据库中获取该副本。如果数据库中的数据以其他方式更改,则在重新读取更改的记录之前,您的数据集不会有这些更改。这适用于您,因为时间戳值是在数据库中设置的,而不是通过数据集设置的。这可以通过关闭然后打开数据集来完成。

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