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 时,它对我有用,即没有连接。
我有一些使用 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 时,它对我有用,即没有连接。