2017-02-27 54 views
0

在VBA中,我尝试使用ADO记录集和连接在SQL Server #TEMP表上执行单独的操作。使用ADO记录集和连接来更新相同#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变量是零 - 在我看来,连接对象看不到任何的通过记录插入的记录。

+0

你应该使用'## TEMP'来给它全局范围。 – Lankymart

+0

[SQL Server中临时表的作用域]的可能重复(http://stackoverflow.com/questions/18614344/scope-of-temporary-tables-in-sql-server) – Lankymart

+0

尽管它[可能是这个](http ://stackoverflow.com/a/37073685/692942),尝试设置SET NOCOUNT ON;'。 – Lankymart

回答

1

我认为问题在于您在发出删除语句之前未关闭记录集。我也改变了locktype,但这可能是次要问题。这适用于我:

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 
相关问题