使用ADO记录集和连接更新相同的#TEMP表

时间:2017-02-27 21:27:59

标签: sql-server vba adodb

在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

最终记录集requery根本不返回任何记录,raff变量为零 - 在我看来,连接对象看不到记录集插入的任何记录。

1 个答案:

答案 0 :(得分:2)

我认为问题在于您在发出delete语句之前没有关闭记录集。我也改变了锁定类型,但这可能是次要问题。这对我有用:

Dim cn As New ADODB.Connection
Dim rst As New ADODB.Recordset
Dim i As Integer

Const connString As String = "Provider=sqloledb;Data Source=yourserver;Initial Catalog=yourdb;Integrated Security=SSPI;"

'Open Connection.
cn.Open connString

'Create temp table.
cn.Execute "CREATE TABLE #TEMP (COL1 INT)"

'Open rst.
With rst
    .ActiveConnection = cn
    .CursorType = adOpenDynamic
    .LockType = adLockOptimistic
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
rst.Close

'Delete records using connection.
cn.Execute "DELETE FROM #TEMP WHERE COL1 IN (2,4)"

'Display
rst.Open "#TEMP"
While Not rst.EOF
    Debug.Print rst!COL1
    rst.MoveNext
Wend
rst.Close