使用 ADO 记录集和连接更新相同的#TEMP table
Use ADO recordset and connection to update same #TEMP table
在 VBA 中,我尝试使用 ADO 记录集和连接在 SQL 服务器 #TEMP table 上执行单独的操作。
我认为在下面的代码中,记录集和连接使用相同的 session/scope,因此可以使用任一对象访问 #TEMP table。情况似乎并非如此。记录集似乎看到了连接创建的#TEMP table,但连接似乎看不到记录集插入的记录。在连接对象尝试删除后,记录集 returns 没有记录。
我想知道为什么会这样,我该如何正确处理。
编辑:无论我使用本地#TEMP table 还是全局##TEMP table,下面的代码都会失败。
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
最终的记录集重新查询 return 根本没有任何记录,并且 raff
变量为零——在我看来,连接对象看不到任何插入的记录通过记录集。
我认为问题在于您在发出删除语句之前没有关闭记录集。我还更改了锁类型,但这可能是次要问题。这对我有用:
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
在 VBA 中,我尝试使用 ADO 记录集和连接在 SQL 服务器 #TEMP table 上执行单独的操作。
我认为在下面的代码中,记录集和连接使用相同的 session/scope,因此可以使用任一对象访问 #TEMP table。情况似乎并非如此。记录集似乎看到了连接创建的#TEMP table,但连接似乎看不到记录集插入的记录。在连接对象尝试删除后,记录集 returns 没有记录。
我想知道为什么会这样,我该如何正确处理。
编辑:无论我使用本地#TEMP table 还是全局##TEMP table,下面的代码都会失败。
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
最终的记录集重新查询 return 根本没有任何记录,并且 raff
变量为零——在我看来,连接对象看不到任何插入的记录通过记录集。
我认为问题在于您在发出删除语句之前没有关闭记录集。我还更改了锁类型,但这可能是次要问题。这对我有用:
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