ACCESS/VBA:插入自动编号字段返回恼人的警告

Posted

技术标签:

【中文标题】ACCESS/VBA:插入自动编号字段返回恼人的警告【英文标题】:ACCESS/VBA: Insert Into with autonumbering field returns annoying warning 【发布时间】:2011-02-15 15:34:34 【问题描述】:

好的,情况就是这样 让我们有 Table1(A,B,C) A 是一个自动编号字段。

我正在通过 vba 喂表。 由于 A 是自动编号的,所以我像这样忽略它:

SQL = INSERT INTO TABLE1(B,C) VALUES ('something','something else')
DoCmd.RunSQL SQL

这工作正常,访问给了我第一个警告,我将创建一个新行。 这对我来说没问题。然而就在那之后我得到了这个:

Microsoft Access 无法在更新或追加查询中添加所有记录。 由于类型转换失败,它将 1 个字段设置为 Null。 blahblahblah 单击确定以运行查询

如果我点击确定,这不会阻止它工作,但我不希望我的用户看到 那个警告。 无论如何它为什么会弹出?将自动编号字段留空不是很正常吗? 还有其他我不知道的程序吗?我错过了什么?

我环顾了谷歌和这里,但找不到答案:/

(我不想将警告设置为 false,因为我希望添加字段的第一个警告和任何其他最终错误都可见。)

【问题讨论】:

我会使用 CurrentDB.Execute SQL,DBSEECHANGES + DBFAILONERROR dbSeeChanges 仅在您使用 ODBC 服务器数据库作为后端时才需要,例如 SQL Server。如果后端是 Jet/ACE,它就毫无用处(尽管我认为它不会造成任何伤害,因此您可以将它用于向前兼容)。我也不确定是否需要 DML 语句,即不返回记录的 SQL 语句。 字段B和C的数据类型是什么?如果它们不是文本或备忘录,它就会失败。 【参考方案1】:

Microsoft Access 无法在更新或追加查询中添加所有记录。 由于类型转换失败,它将 1 个字段设置为 Null。

该错误与您的自动编号字段无关。检查字段B和C的数据类型。

在此示例中,字段 C 设置为数字,因此我遇到与您相同的错误,并且 INSERT 成功但字段 C 为 Null:

DoCmd.RunSQL "INSERT INTO TABLE1(B,C) VALUES ('something','something else')"

但是,将数值插入字段 C 可以正常工作。

DoCmd.RunSQL "INSERT INTO TABLE1(B,C) VALUES ('something',99)"

编辑:尽管为字段 C 提供了一个文本值,这也可以工作。不同之处在于文本值是数据库引擎可以转换为有效数字的值:

DoCmd.RunSQL "INSERT INTO TABLE1(B,C) VALUES ('something','27')"

【讨论】:

在我看来,应该尽可能避免隐式数据类型转换,但这是一个很好的观点。 哈,我现在有点惭愧。我正在将复选框转换为布尔值以填充是/否字段。通过直接输入复选框的值来尝试,现在它可以工作了......【参考方案2】:

显然是由于自动编号字段吗?添加记录后(单击“仍然运行”运行查询),只有自动编号字段为空白?

自动编号不应发生此错误;至少,我以前从未见过。

【讨论】:

好吧,一旦我覆盖了错误并告诉 access 运行查询,一切都很好:我没有得到任何空值并且自动编号工作。所以我不知道这是从哪里来的......【参考方案3】:

听起来您正在将一个空字符串传递给其中一个值,并将该列设置为 NULL。

当你说

这并不妨碍它工作 如果我点击确定

是否所有字段都正确填充?包括自动编号?

【讨论】:

是的。但实际上其中一个字段是空白的(字符串字段用''填充)。 '' (两个单引号)不是一个有效的字符串吗?我去看看。 用一些数据填充我的表单中的空白字段,仍然引发完全相同的错误(没有任何其他空白字段)。

以上是关于ACCESS/VBA:插入自动编号字段返回恼人的警告的主要内容,如果未能解决你的问题,请参考以下文章

Access vba:如何在两个相关表中执行插入?

在 Access VBA 中禁止写入冲突消息

Access VBA:查询输入必须至少包含一个表或查询

从 Access VBA 自动增量创建的文件夹名称

在 sql 中插入语句,其中一个字段设置为自动编号

Microsoft Access VBA 插入错误