1

最近一些 Delphi / InterBase 应用程序展示

“其他用户未找到或更改记录”

它们使用 dbExpress 的默认 TSQLQuery/TClientDataSet(或 TSimpleDataSet)组件。

我们发现,在数据库表中,非 dbExpress 应用程序以毫秒为单位存储了一个字段。

看起来 dbExpress 没有从 DB 读取毫秒数,并在更新表 SQL 语句的“where”条件中使用该截断值,因此没有匹配的记录要更新。

更新:我们在 Delphi 应用程序中使用 TSQLTimeStamp 字段。没有 OnBeforePost 处理程序正在修改字段值。

更新 2

从 IBExternals.pas 中可以看出,PCTimeStructure 没有毫秒部分。所以'按设计'不支持 Delphi (2009) 中的 InterBase 毫秒。

有谁知道在更高版本的 Delphi 中是否添加了 ms 支持?

4

3 回答 3

3

我猜这是不支持毫秒的isc_decode_timestamp Interbase/Firebird 客户端 API。是一个相关的 Firebird 跟踪器问题。

更新:也看到这个答案

于 2011-03-11T11:08:58.370 回答
0

不太了解 dbexpress,无法以一种或另一种方式说,但它可能是正在进行修剪的数据库。我确实知道,例如 SQL 服务器确实会丢弃传递给它的毫秒数。您可以尝试使用 TIMESTAMP 列而不是 DATETIME(不确定确切的名称)。也许 TIMESTAMP 列在您使用的数据库中确实具有毫秒分辨率。

于 2011-03-11T10:48:17.570 回答
-1
var
  tmpDTS: string;
  tmpDT: TDateTiume;

DateTimeToString(tmpDTS,'yyyy"."mm"."dd" "hh"."nn"."ss" "zzz',tmpDT);

使用这种格式,我在 Firebird 表中插入一条记录(通过 TSQLQuery),Flamerobin 显示了确切的值。

相反,如果我通过 TDateTime 参数插入值,则会截断毫秒。DBGrid 显示截断的值。

Delphi XE、Db Express、驱动程序 Firebird、Firebird 2.5.1。

于 2012-07-13T15:47:41.527 回答