2009-07-21 40 views
0

我试图运行将字段复制到新表中的代码,将它们从_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_New)都是有效的。 Option Explicit在文件的其他位置设置,以避免拼写错误造成混淆。错误发生在DoCmd行。

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

+1

什么线是它引发错误? 你可以尝试添加“选项显式”到你的代码的顶部,看看它是否仍然编译? – JohnFx 2009-07-21 18:42:37

+0

添加信息来回答您的问题。 – 2009-07-21 18:46:12

+0

您是否尝试直接运行查询(在您的代码之外)。这可能会解决问题。 – JohnFx 2009-07-21 18:50:40

回答

3

您可以发布Records和Records_New表的表格描述吗? 我打赌你试图插入一个NULL值到“Records”表的列中(列描述不是NULL)。

希望这会有所帮助。

-1

也许定时器需要parens?

QueryTimer = Timer() 
+0

`定时器`是一个VBA内建函数,自1970年1月1日以来返回小数秒。它用在其他地方没有问题。 iffy行是`DoCmd.RunSQL`行。 – 2009-07-21 18:41:00

+0

计时器功能:“返回单个表示从午夜开始经过的秒数......在Microsoft Windows中,计时器函数返回秒的小数部分”(http://office.microsoft.com/zh-cn/access/HA012289231033 .aspx)注意它可以用作Access数据库引擎查询中的表达式。 – onedaywhen 2009-07-22 07:28:02

1

我认为这将有所帮助,如果你也改变插入语句,以更具体地介绍它插入/选择哪些列。您通过非特定的方式询问错误。

这看起来好像对您的答案没有响应,但我怀疑选择表和目标表中的列未排好队列,或者目标表中有一个不允许为空的字段。

试试这个:

在一个新的查询(在SQL视图)粘贴您的查询“INSERT INTO记录SELECT * FROM Records_New”并尝试手动运行它。我敢打赌,你会得到一个更具体的错误,并且可以在运行它之前对其中的查询进行疑难解答,并在其周围增加代码的复杂性。

0

INSERT INTO Statement (Microsoft Access SQL)

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

INSERT INTO Records SELECT * FROM [Records_New]; 

这里有您需要的内容:

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