【发布时间】:2019-04-18 00:51:32
【问题描述】:
几周以来我一直在使用断开连接的记录集,通常从 SQL Server 检索数据,断开 rs 连接并在 VBA 中进行过滤/格式化。现在我试图做相反的事情并从头开始创建一个新的 ADO 记录集,然后将它连接到我的数据库并使用 UpdateBatch 将记录集插入数据库而不使用循环。此时我有一个完全填充的记录集,将其重新连接到我的连接字符串,然后尝试 UpdateBatch。可以理解,此时它没有关于我要更新哪个表的信息(只有通过连接字符串的数据源和初始目录)。是否有我用来提供相关表的记录集属性?此外,我尝试导入的表有一个 GUID 字段(第一个字段),我在断开连接的记录集中故意将其留空,假设在导入时,SQL Server 会自动分配此 GUID/主键。
我在“rs.UpdateBatch”之后遇到的具体错误是 运行时错误'-2147467259 (80004005)'" 用于更新或刷新的基表信息不足。
我知道我可以使用循环和 SQL 命令“INSERT INTO ...”。我想使用记录集对象,因为它们提供了更多功能作为数据容器。我没有尝试过的一件事是首先从相关表中检索记录集,然后清除它并用新数据重新填充它,以便记录集本身保留所有原始数据库和表属性。如果这是唯一/最好的方法,我也可以尝试这条路线。我只是想看看是否可以创建一个 ADO 记录集,填充它,然后将它插入到我选择的匹配表中。
dim rs as ADODB.Recordset
set rs = New ADODB.Recordset
With rs.Fields
.append "alias", adVarChar, 255
.append "textA", adVarChar, 255
.append ......
End With
rs.Open
rs.AddNew Array(0, 1, 2, ..., n), Array(val0, val1, val2, ..., valn)
rs.Update
call importRS(rs)
rs.close
set rs = nothing
在上面的 rs.update 之后,一些记录集可能需要进入数据库,其他记录集对象只是用于加快过滤和排序,所以我只是将它们用作方便的容器,它们永远不会去 importRS()
但是,如果我需要将断开连接的记录集发送到数据库,我只想将记录集对象传递给另一个用于打开连接、发送更新和关闭连接的函数。下面的代码将达到这个目的,这就是为什么我想等到此时建立连接,就在我的 rs 被填充后的最后。
sub importRS(byref rs as ADODB.Recordset)
dim cn as ADODB.Connection
set cn = New ADODB.Connection
cn.ConnectionString = strConnection 'my connection string variable'
cn.Open
rs.ActiveConnection = cn
rs.UpdateBatch '-------error message appears on this line
cn.close
set cn = nothing
【问题讨论】:
-
是的,这可以做到。我在下面写了一个工作示例。
-
查看下面的更新答案。