使用 VB6 将 DAO 日期时间字段重置为空
Posted
技术标签:
【中文标题】使用 VB6 将 DAO 日期时间字段重置为空【英文标题】:Reset a DAO datetime field to nothing with VB6 【发布时间】:2014-11-20 14:19:03 【问题描述】:在一个旧的 VB6 程序中,我有一个与窗体上的文本控件相关联的数据控件。 JET 数据库中的一些表字段是日期时间字段。
日期时间字段没有默认值,因此当第一次显示在表单上时,它们显示为空白。当它们最终被设置时,文本字符串被验证为日期,数据控件会及时更新记录。
如果用户希望删除日期(例如,更正之前的数据输入),他们只需将该字段留空。保存时不会发生错误,但不会更新受影响的日期时间字段。再次查看记录时,可以看到最后输入的日期。
检查文本控件的 DataChanged 属性后,我可以看到日期值已更改为空白 (= cNullString)。
因此,我假设记录的最终保存会忽略 cNullString,因为它认为它对于日期时间字段无效。
当我的用户输入空白时,如何强制 datetime 字段恢复为空,以便下次查看时再次为空白?
【问题讨论】:
尝试输入 0。日期通常以自日期以来的单位存储。在 Windows 中,整数是天数,分数是自 (1/1/1601??) 以来一天中的时间。 如果我这样做,我实际上会输入一个日期,当用户再次查看记录时,他们会看到第 0 天的日期。我希望他们看到空白。我还试图避免转换,例如检测第 0 天并将该字段设为空白,然后在保存之前恢复 0。 【参考方案1】:请务必通过 IDE 将 TextBox.DataFormat 设置为“日期”或特定日期格式。那么底层的 StdDataFormat 对象应该有它的 NullValue 属性 = "" 并且它变得有效。
正如文档所说:
当 Type 属性设置为 fmtGeneral 时忽略。每次获取空字段时都会读取 NullValue 属性。
我不确定这是否可以完全在代码中设置。在设计时在 IDE 中设置时,您会将属性设置为(此处为美国英语语言环境):
BeginProperty DataFormat
Type = 1
Format = "M/d/yyyy"
HaveTrueFalseNull= 0
FirstDayOfWeek = 0
FirstWeekOfYear = 0
LCID = 1033
SubFormatType = 3
EndProperty
但是SubFormatType
似乎是关键,并且该属性似乎不会在运行时公开以供更改。
注意
针对 ADO 数据控件而不是旧的 DAO 版本进行了测试。然而,这些绑定属性超越了 ADO-DAO 的界限,所以这应该是适用的。
【讨论】:
我从未使用过 DataFormat,但在研究此问题时尝试过它。当我尝试设置它时,VB 说“此数据源不支持 DataFormat 属性。有问题的数据源是标准的 VB 数据控件。我以为我是一个版本(Access 97 而不是 Access 2000)。尽管如此,您的提示是非常好的信息。谢谢。 嗯,这毕竟可能是一个 DAO 问题,或者我想是 Jet 3.x 问题。抱歉,您不能使用它,当我使用 ADO 数据控件和 Jet 4.0 数据库进行尝试时,它完全符合您的要求。【参考方案2】:如果编写 DAO 代码来清除 Date 字段,我发现我必须使用“Empty”。 Null 和 "" 不起作用。因此,对于字段 dtmDelivery(日期类型),我必须使用以下内容。 strDelivery 只是一个包含日期的字符串。
Set rst = dbs.OpenRecordset("tblSomething", dbOpenDynaset)
If (strDelivery = "") Then
rst!dtmDelivery = Empty
Else
rst!dtmDelivery = strDelivery
End If
rst.Update
【讨论】:
以上是关于使用 VB6 将 DAO 日期时间字段重置为空的主要内容,如果未能解决你的问题,请参考以下文章
VB6.0中,日期时间控件不允许为空时,采用文本框与日期时间控件相互替换赋值(解决方案)
VB6、MS Access、DAO - 显示列名不为空的所有记录