【问题标题】:"Null" value in Queries查询中的“空”值
【发布时间】:2010-11-12 18:06:11
【问题描述】:

我正在尝试运行将字段复制到新表中的代码,将它们从_New 表移动到原始表。执行此操作的 VBA 代码如下所示:

SQLStatement = CStr("INSERT INTO " & TName & " SELECT * FROM " & TName & "_New")
Log.WriteLine "Running query with string """ & SQLStatement & """ "
QueryTimer = Timer
DoCmd.RunSQL SQLStatement
Log.WriteLine "Query time: " & (Timer - QueryTimer)

日志只是我放在一个类模块中的几个过程。它的错误输出是

@142921:  Running query with string "INSERT INTO Records SELECT * FROM Records_New" 
@142941:  Error Date/Time: 7/21/2009 2:29:40 PM
@142941:  Error # & Description: 3162, You tried to assign the Null value to a variable that is not a Variant data type.

我可以确认 TNameSQLStatement 在 SQL 操作运行时都是有效的字符串,并且源(Records 和 Records_New)都是有效的。 Option Explicit 设置在文件的其他位置,以避免因拼写错误而造成混淆。错误在DoCmd 行抛出。

即使DoCmd.RunSQL 没有返回值,为什么它会有一个Null 值?

【问题讨论】:

  • 在哪一行抛出错误?您可以尝试在代码顶部添加“选项显式”并查看它是否仍然可以编译?
  • 添加信息以回答您的问题。
  • 您是否尝试直接运行查询(在您的代码之外)。它可能会对问题有所帮助。

标签: sql ms-access ms-access-2007 vba


【解决方案1】:

您能否发布 Records 和 Records_New 表的表描述? 我敢打赌,您正在尝试将 NULL 值插入“记录”表的列之一(并且列描述不是 NULL)。

希望这会有所帮助。

【讨论】:

  • 原来是这个问题。源 (Records_New) 是一个存储的访问查询,它包含一个表中不存在于 Records 表中的所有记录(基于具有 Null ID 自动编号的 Records)。 INSERT 尝试应用 Null 自动编号,这是不允许的。隐藏 ID 号检查的结果解决了这个问题。
【解决方案2】:

我认为,如果您还将插入语句更改为更具体地说明它正在插入/选择哪些列,这将有所帮助。你这么不具体是在问错误。

这似乎对您的回答没有响应,但我怀疑选择表和目标表中的列没有对齐,或者目标表中有一个字段不允许为空。

试试这个:

在一个新的查询中(在 SQL 视图中)粘贴您的查询“INSERT INTO Records SELECT * FROM Records_New”并尝试手动运行它。我敢打赌,您会遇到更具体的错误,并且可以在运行查询之前对查询进行故障排除,因为它周围的代码会增加复杂性。

【讨论】:

  • 在 SQL 查询中粘贴会给出一个错误对话框,其中包含代码中捕获的相同消息。关于这个错误的帮助没有提供任何解释,因为我一开始就无法弄清楚 Null 的设置。
  • 在这种情况下,我建议重写查询以更明确地了解源表和目标表中的确切字段。还要双重/三重检查目标表中的所有字段都不允许空值,并且两个表中的字段类型相同。
【解决方案3】:

INSERT INTO Statement (Microsoft Access SQL)

您的 SQL INSERT 语句不正确 - 应该是:

INSERT INTO Records SELECT * FROM [Records_New];

这是你需要使用的:

CStr("INSERT INTO " & TName & " SELECT * FROM [" & TName & "_New)"];")

【讨论】:

  • ns 有什么用?我以前从未在 SQL 语法中看到过这种情况?
  • 它是一个表别名,所以您知道您是从 RECORDS_NEW 表中获取 * 而不必担心它可能会从 RECORDS 中获取。
  • 您的语法给出了一个新错误:@151343: Error # & Description: 3075, Syntax error in query expression 'SELECT n.* FROM Records_New n'.
  • 尝试不使用表别名 - 这是一种习惯,抱歉。
  • 在此处使用 VALUES 无济于事,因为它仅适用于单个记录 INSERTVALUES 需要一个值列表,每个字段一个,而不是像 SELECT 那样返回的记录列表。
【解决方案4】:

也许 Timer 需要括号?

QueryTimer = Timer()

【讨论】:

  • Timer 是一个 VBA 内置函数,它返回自 1970 年 1 月 1 日以来的几分之一秒。它在其他地方使用没有问题。不确定的行是DoCmd.RunSQL 行。
  • Timer 函数:“返回一个 Single 表示自午夜以来经过的秒数......在 Microsoft Windows 中,Timer 函数返回秒的小数部分”(office.microsoft.com/en-us/access/HA012289231033.aspx)注意它可以用作Access 数据库引擎查询中的表达式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-11
  • 1970-01-01
  • 2015-04-18
  • 2018-04-22
  • 2011-02-14
  • 1970-01-01
相关资源
最近更新 更多