最近有一些Delphi / InterBase应用程序显示
“其他用户未找到或更改记录”
他们使用dbExpress的默认TSQLQuery / TClientDataSet(或TSimpleDataSet)组件。
我们发现在数据库表中,非dbExpress应用程序存储了一个毫秒的字段。
看起来dbExpress没有从DB读取毫秒数,并在更新表SQL语句的“where”条件中使用该截断值,因此没有要更新的匹配记录。
更新:我们在Delphi应用程序中使用TSQLTimeStamp字段。没有OnBeforePost处理程序正在修改字段值。
更新2
从IBExternals.pas中可以看出,PCTimeStructure没有毫秒部分。所以'设计'在Delphi(2009)中对InterBase不支持毫秒。
是否有人知道在后续版本的Delphi中是否添加了ms支持?
答案 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。