【问题标题】:Reading dates from Sqlite with Delphi / Firedac使用 Delphi / Firedac 从 Sqlite 读取日期
【发布时间】:2017-09-22 19:38:06
【问题描述】:

从 Sqlite 将日期字段读取到 Firedac 时,出现转换错误。这些字段称为日期,但带有字符串条目 (yyyy-mm-dd)。我设置了 Datetime Format = string 的选项,但我发现虽然可以正常处理空值,但空值 (= '') 会产生一个错误,我不知道如何处理。

【问题讨论】:

  • 你能贴一些代码吗? Sqllite 将日期存储为字符串或整数,因此您可能需要进行一些转换。如果我们看到一些代码,也许我们可以提供帮助..
  • 嗯,空字符串不是有效的日期字符串。他们应该怎么办?

标签: sqlite delphi firedac


【解决方案1】:

您可以启用StrsEmpty2Null 选项,它会自动将所有空字符串转换为NULL 状态。但它适用于数据组件处理的所有值和参数。所以这不是治愈方法。

我不确定你在做什么,但总的来说,NULL 是一种状态,你不能将 NULL 状态转换为一个值,因为它是一个表示没有值的状态。所以你不能将空字符串转换为日期。

所以试着描述更多关于你的价值到字符串转换的信息,这样我们就可以提出一个合适的方法来处理它。对于 SQLite,我建议使用 DATE 伪数据类型并通过内置格式表达式转换值。

【讨论】:

  • 谢谢。 StrsEmpty2Null 选项解决了这个问题。我正在创建一个可以列出任何 Sqlite 数据库中的表和字段并执行查询的应用程序。 Firedac 无法处理日期字段中的空字符串让我束手无策。当然,对于目标数据库应用程序,数据库不应包含空字符串和空字符串。
  • 不客气!但是,对于您描述的工具,启用StrsEmpty2Null 选项并不好(因为它将使所有空字符串值和参数值都为空)。如果我作为此类应用程序的用户想要查看哪些值是空的,哪些是 NULL 怎么办?让我们找到更好的方法。您能否详细说明您如何使用数据集组件?您是否构建持久字段?或者什么以及何时引发异常或导致某些问题?
  • StrsEmpty2Null 确实显示空值和空值相同,但我仍然可以分别查询空 (x = '') 或空值 (x = null)。但是,它对诸如 date = '2009-02-29' 这样的糟糕数据没有帮助。
  • 我以为我可以使用数据映射选项来处理这个问题,但是当我尝试在我的查询对象(dtDate 到 dtAnsiString)上设置映射规则时,我收到一个错误,即最大长度为零(甚至虽然我设置了sizemax。我不使用持久字段,因为这个项目的目的是打开任何sqlite db并查询它。
  • 好吧,我仍然没有足够的信息来提供帮助。您自己识别数据类型吗?如果是这样,请考虑如何处理具有文本值2017-09-26 的单个元组的表。您会将其视为日期字段吗?日期格式是否为常量(由 SQLite 支持的 ISO 定义)?那么,如果有人添加另一个带有文本ABCD 的元组怎么办?这个话题相当广泛。也许尝试问另一个问题并详细描述您如何检测非 FireDAC 数据库的日期、时间和日期时间数据类型的字段类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
  • 2013-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多