dbExpress不读取TimeStamp字段的毫秒部分

时间:2011-03-11 10:35:20

标签: delphi timestamp dbexpress interbase

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

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

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

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

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

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

更新2

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

是否有人知道在后续版本的Delphi中是否添加了ms支持?

3 个答案:

答案 0 :(得分:3)

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

更新:另见answer

答案 1 :(得分:0)

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

答案 2 :(得分:-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。