我对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。 [更新]正如下面提到的评论帖子(也许应该最初提到过),在这种情况下,我使用TDateTime
和IncSecond(startTime, delay * i)
生成一些用于测试海豚的虚拟数据。所以,实际上,我正在写一个TDateTime到那个字段,然后我关闭/打开数据源,显示新行的所有其他字段,但不是那个。
但是,这实际上是从我的原文中脱离出来的,"请提供一个例子"问题并将其变成"请修改我的代码"题。任何一个答案都会让我很开心。
答案 0 :(得分:1)
您正在寻找错误的地方,您的问题出在数据集中。对于从外部数据库获取数据的所有数据集,这是一个通用问题。
您的查询/数据集包含数据库中数据的副本。它在打开时或使用它来更新/将记录插入数据库时从数据库中获取该副本。如果数据库中的数据以其他方式更改,则在重新读取更改的记录之前,数据集将不会进行这些更改。这适用于您,因为时间戳值是在数据库中设置的,而不是通过数据集设置的。这可以通过关闭然后打开数据集来完成。
使用FireDAC,尝试设置查询UpdateOptions .RefreshMode := rmAll
。当查询中有一个表时,它对我有用,即没有连接。