【问题标题】:dbExpress does not read the milliseconds part of TimeStamp fieldsdbExpress 不读取时间戳字段的毫秒部分
【发布时间】:2011-03-11 10:35:20
【问题描述】:

最近一些Delphi/InterBase应用展示

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

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

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

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

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

更新 2

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

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

【问题讨论】:

标签: delphi timestamp dbexpress interbase


【解决方案1】:

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

更新:另见answer

【讨论】:

  • IBExpert 正确显示数据的毫秒部分,所以我认为这在 InterBase 客户端库中已修复
  • 好的,现在我在 IBExternals.pas 中看到它 - PCTimeStructure 没有毫秒部分。所以在 Delphi (2009) 中“设计”不支持 InterBase 毫秒:P
  • IBExpert 根本不使用 API。我认为他们正在使用 FIBPlus,它使用 PISC_QUAD(FXSQLVAR^.sqldata)^ 来检索时间戳。
  • 答案“几乎”正确 - 实际上 InterBase/Firebird 客户端 API 支持 时间戳,但 Delphi 使用不包括毫秒的 API 函数调用...
  • @mjn Firebird DBX 驱动程序使用了不支持时间戳毫秒的特定 API,这就是问题所在。 IB/FB API 我没有说什么。
【解决方案2】:

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

【讨论】:

  • 数据库值正确(以毫秒为单位)。我已经更新了所有记录以将毫秒设置为零,现在应用程序可以工作了。在有补丁之前,我们必须修改另一个(正确)以毫秒为单位写入时间戳值的应用程序。
【解决方案3】:
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。

【讨论】:

  • 是的,我知道直接执行 DSQL 会绕过截断。这是一种解决方法。
猜你喜欢
  • 2012-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-22
  • 2016-09-22
  • 2015-11-06
  • 1970-01-01
  • 2012-02-12
相关资源
最近更新 更多