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

时间:2015-03-21 20:32:14

标签: sqlite delphi timestamp delphi-xe7 firedac

我对MySql有一些经验,并且第一次转向Sqlite。

Sqlite documentation for data types,第1.2节说明了

  

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

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

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。


[更新]正如下面提到的评论帖子(也许应该最初提到过),在这种情况下,我使用TDateTimeIncSecond(startTime, delay * i)生成一些用于测试海豚的虚拟数据。所以,实际上,我正在写一个TDateTime到那个字段,然后我关闭/打开数据源,显示新行的所有其他字段,但不是那个。

但是,这实际上是从我的原文中脱离出来的,"请提供一个例子"问题并将其变成"请修改我的代码"题。任何一个答案都会让我很开心。

1 个答案:

答案 0 :(得分:1)

您正在寻找错误的地方,您的问题出在数据集中。对于从外部数据库获取数据的所有数据集,这是一个通用问题。

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

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