2009-07-21 42 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)"];")