2016-08-06 17 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示例。

相关问题