【发布时间】:2017-02-28 15:20:38
【问题描述】:
在 VBA 中,我尝试使用 ADO 记录集和连接对 SQL Server #TEMP 表执行单独的操作。
我认为在记录集和连接下面的代码中使用相同的会话/范围,因此可以使用任一对象访问#TEMP 表。情况似乎并非如此。记录集似乎可以看到连接创建的#TEMP 表,但连接似乎看不到记录集插入的记录。并且记录集在连接对象尝试删除后不返回任何记录。
我想知道为什么会这样,以及如何才能正确地做到这一点。
编辑:无论我使用本地 #TEMP 表还是全局 ##TEMP 表,下面的代码都会失败。
Dim cn As New adodb.Connection
Dim rst As New adodb.Recordset
'Open Connection.
cn.Open cConnSeasFcst
'Create temp table.
cn.Execute "CREATE TABLE #TEMP (COL1 INT)"
'Open rst.
With rst
.ActiveConnection = cn
.CursorLocation = adUseClient
.CursorType = adOpenDynamic
.LockType = adLockBatchOptimistic
End With
'Add records to temp table using rst.
rst.Open "#TEMP"
For i = 1 To 5
rst.AddNew
rst!COL1 = i
rst.Update
Next
'Delete records using connection.
cn.Execute "DELETE #TEMP WHERE COL1 IN(2,4)", raff
'Display.
rst.Requery
While Not rst.EOF ' ##ALWAYS AT EOF. RECORDS ARE NOT RETURNED.##
Debug.Print rst!COL1
rst.MoveNext
Wend
最终的记录集重新查询根本不返回任何记录,raff 变量为零——在我看来,连接对象看不到记录集插入的任何记录。
【问题讨论】:
-
您应该使用
##TEMP为其提供全局范围。 -
虽然是could be this,但请尝试设置
SET NOCOUNT ON;。 -
@Lankymart 相同的代码因全局 ##TEMP 表而失败。我也试过
SET NOCOUNT ON;,但也失败了。 -
你为什么要使用
CursorLocation = adClient?您是否尝试过仅使用ADODB.Recordset和默认值,而不是尝试精心设计的光标和锁定组合?您应该首先尝试将代码分解为最简单的形式。
标签: sql-server vba adodb