使用 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 使用 DAO.Relation?

VB6.0中,日期时间控件不允许为空时,采用文本框与日期时间控件相互替换赋值(解决方案)

VB6 数据库上的 DAO 3.6 问题

VB6、MS Access、DAO - 显示列名不为空的所有记录

ASP SQL中,查询条件为日期字段的一个时间段,或者日期字段为空,怎么写查询

日期字段在 PHP 和 MySQL 中被重置