2016-08-06 35 views
0

應該如何正確寫入記錄集的名稱? & rsg &在「sq3 = ...」行處出現類型不匹配錯誤。提前致謝。MS ACCESS VBA:將記錄集名稱中的不匹配錯誤輸入到SQL語句中字符串

Dim rsG As DAO.Recordset 
Dim sq2, sq3 As String 

sq2 = "SELECT * from GeneralTable " 
sq2 = sq2 & "where gsede='LION' and (gExclu is null) and (gAda is null) " 
sq2 = sq2 & "order by gnomb,gnif;" 

Set rsG = CurrentDb.OpenRecordset(sq2) 

sq3 = "UPDATE " & rsG & " SET gsede ='AA' WHERE gsede='LION'" 

DoCmd.RunSQL (sq3) 
+0

看起來您對問題有三個非常有用的答案。因爲你對我來說還是個新手,所以我想我會指出,如果你向他們提供反饋,這對他人非常有用。通過點擊向上箭頭可以完成答案,並告訴他們他們的答案對你有用。我們都欣賞生活中的小事。如果你可以選擇一個答案作爲最好的檢查它。更多的反饋意見,它有助於關閉問題。享受你的留下來... – dbmitch

回答

2

使用單個查詢執行更新:

update generaltable 
    set gsede = 'AA' 
    where gsede ='LION' and (gExclu is null) and (gAda is null); 

如果你做掉的rsG的更新,那麼你很可能會做的每一行單獨update,這是低效的。

+0

謝謝,這只是一個例子,我知道這個代碼做兩次相同。我的問題是如何正確地將記錄集變量名寫入到SQL字符串中,而沒有編譯錯誤。 – Spiromer

+0

我認爲...從UPDATE sql使用記錄集是非法的嗎? – Spiromer

3

你在混合使用完全不同的方法來更新數據 - 更新SQL和VBA記錄集。

如果您想通過行更新記錄行,你這樣做

Do While Not rsG.EOF 
    If rsG!foo = "bar" Then 
     rsG.Edit 
     rsG!gsede = "AA" 
     rsG.Update 
    End If 
    rsG.MoveNext 
Loop 
+0

謝謝,我知道。就像你說的,我原來的代碼是循環的。所有的代碼都是用vba recordset寫的。但是我有這個想法:爲什麼不用sql update更改所有循環行? ... – Spiromer

2

不能混搭SQL和Recordset對象。您可以構建完整的更新語句,其中包含第一個選擇的邏輯(如其他答案所示),或者可以打開動態記錄集並以編程方式遍歷記錄以進行更新。這就是說,以編程方式循環執行大型記錄集以進行更新通常可以通過批量SQL語句更好地處理,除非在代碼中單獨考慮每行是必不可少的 - 在基本示例中這不會是這種情況。

MS在DAO.Recordset object上有一篇很好的文章。有一個關於中途的動態類型的Recordset示例。

相關問題