2011-03-11 62 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