2011-03-11 63 views
1

最近一些德尔福/ IB的应用程序的显示的dbExpress不读时间戳字段的毫秒部分

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

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

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

它看起来像dbExpress没有从数据库中读取毫秒,并在更新表SQL语句的'where'条件中使用该截断值,因此没有匹配的记录被更新。

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

更新2

如可以在IBExternals.pas PCTimeStructure可以看到没有一个毫秒部分。所以'设计'不支持德尔福InterBase(2009)的毫秒数。

有没有人知道如果MS支持已被添加到德尔福的更高版本?

+0

另请参见:https://forums.embarcadero.com/thread.jspa?threadID=109177&tstart=0 – mjn 2014-10-16 09:43:56

回答

3

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

更新:另请参阅此answer

+0

页面为日文:) – mjn 2011-03-11 11:12:29

+0

IBExpert正确显示数据的毫秒部分,所以我认为这是在InterBase客户端库中修复的 – mjn 2011-03-11 11:13:32

+0

@mjn谢谢,修正;-) – 2011-03-11 11:14:09

0

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

+0

数据库值正确(以毫秒为单位)。我更新了所有记录以将毫秒设置为零,现在应用程序可以工作。在有补丁之前,我们必须修改其他应用程序(正确)以毫秒为单位写入时间戳值。 – mjn 2011-03-11 11:04:53

+0

好的,谢谢你的信息! – 2011-03-11 11:32:52

-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。

+1

是的,我明白直接执行DSQL会绕过截断。这是一种解决方法。 – mjn 2012-07-13 16:17:14