【问题标题】:MS Access: How does one insert NULL into DateTime fieldMS Access:如何将 NULL 插入 DateTime 字段
【发布时间】:2011-04-01 21:23:55
【问题描述】:

我有一个 MS Access 数据库(无法忍受),并通过 PHP (ODBC) 与它通信。

我必须在我的 INSERT 语句中包含一个 DateTime 字段。此字段在 Access 中未定义为“必需”,这意味着它确实可以为 NULL,实际上 Access 数据库中的某些行已经为 NULL。

我遇到的问题很简单:如何通过 SQL 插入 NULL?我在网上找到的所有结果都是通过 Visual Basic 或 C# 解决的,而我在 PHP 中通过 ODBC 使用 SQL。

我已经尝试了以下方法:

INSERT INTO table_name (datetime_field) VALUES (NULL)
INSERT INTO table_name (datetime_field) VALUES (#NULL#)
INSERT INTO table_name (datetime_field) VALUES ('NULL')
INSERT INTO table_name (datetime_field) VALUES ('#NULL#')
INSERT INTO table_name (datetime_field) VALUES ('')

(我的查询中还有大约 30 个其他列。)

当我尝试“”或 NULL 时,我得到的确切错误是“条件表达式中的数据类型不匹配”。其他返回解析错误(可以理解)。

请注意,我必须在 INSERT 语句中包含该字段。该字段有一个默认值,但在许多情况下,我传输的原始数据有一个 NULL,在目标数据库中也必须是一个 NULL。

提前致谢!

【问题讨论】:

  • 大约有 30 列,它们都不是自动递增的,其中一些有默认值,但它们都在查询本身中。
  • 啊,好吧,所以您只是将示例缩减为一列?您是否尝试过更新一行并将字段设置为 NULL 只是为了查看?
  • 我同意 Paul Sasik 的观点,我已经在 ADO 和查询设计窗口中的 Access 中尝试过查询,并且 Access 对 null 非常满意。
  • 在 Access 中打开数据库并尝试将您的第一个 INSERT 语句作为新查询...暂时将 ODBC 和 PHP 排除在外。根据您告诉我们的所有内容,我不明白为什么 Access 的数据库引擎会拒绝您的第一个示例 INSERT 语句。
  • OP 未使用 Access。 SQL 模式是 Access 设置,而不是 Jet/ACE 设置。因此,您的问题和 OP 的来源不可能相同。

标签: php ms-access odbc ms-access-2007


【解决方案1】:

我有这种类型的错误,并且 试试这个。

INSERT INTO table_name (datetime_field) VALUES (DBNull.value)

对我来说很好用。

【讨论】:

    【解决方案2】:

    INSERT INTO table_name (datetime_field) VALUES (DbNull.Value)

    【讨论】:

      【解决方案3】:

      我知道你已经知道了,但也有 dbNull

      【讨论】:

        【解决方案4】:

        试试下面的。它对我有用:

        INSERT INTO sometable ( somedate, somethingelse )
        SELECT Null AS Expr1, "foo" AS Expr2;
        

        基本上,您将 null 包装在 select 查询中,并让 SQL 确定如何将其表示为插入。


        -- 编辑--

        这也应该有效:

        INSERT INTO sometable ( somedate, somethingelse )
        values (Null , "foo");
        

        但由于某种原因,我的默认安装没有。

        我预感到,我将我的数据库从 ANSI-89 切换到 ANSI-92,VALUES 方法开始工作。我将它切换回 ANSI-89,它仍然有效。不仅如此,在我创建的任何新数据库上,它现在也可以工作。奇怪......安装中的某些东西必须通过来回切换而改变(并坚持),而不仅仅是 ANSI-89/92。这似乎就是我们得到不同结果的原因。

        你可以通过Office Logo->Access Options->OBJECT DESIGNERS->QUERY DESIGN切换数据库。更改 SQL Server 兼容语法 (ANSI 92) - 并检查“此数据库”。

        好的,很奇怪。

        【讨论】:

        • 你必须有一个带有 Access 的 from 表,这是行不通的。
        • 将 SELECT... 替换为 VALUES (Null, "foo")
        • @Remou - 我已经在 MS Access 2007 中本地尝试过 - 它可以工作。那是直接复制和粘贴
        • 您可以在没有 FROM 的情况下插入单行 SELECT。如果您想为 INSERT 合并两个 SELECT,那就另当别论了。
        • @CodeSlave 有趣的是,在这种情况下,您选择不需要来自表的选择是正确的,但是,我不明白为什么 Values 不适合您。它是标准 SQL,并且在 ADO 和本机的每个版本的 Access 上都可以使用。
        【解决方案5】:

        您使用哪些库来与 ODBC 通信?
        库解释它的方式可能是空值的语法问题吗?

        看看this 页面是否有帮助。
        注意:我没有使用过 PHP。

        【讨论】:

        • 我在 PHP 中使用 ODBC 组件。不过没关系,因为我只是将 SQL 传递给 ODBC 驱动程序。
        • 我不经常在 PHP 中工作,但是可能有一个 PHP 魔法值是 Null 还是什么?也就是说,您是否在 SQL 语句中将单词“Null”作为字符串传递?这是一个很长的镜头......
        【解决方案6】:

        试着留空

        (values fld1,,fld2)
        

        【讨论】:

        • 我不相信这会起作用,它会导致 ADO 和查询设计窗口中的语法错误。
        • 您也可以尝试完全省略对该字段的引用-插入 (fld1,fld3) 值 (val1,val3)
        • 是的,你是对的,忘记了。由于它是一个日期字段,请尝试为零。
        • (叹气)好的,我们还遇到了一个 DB2 ODBC 驱动程序的问题,它必须以某种方式配置才能将日期传递给 MS Access dbs。这可能与 ODBC 驱动程序设置有关。
        • 我不能留空,因为它有一个默认值,所以如果我留它,它就不会为空。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多