2017-02-27 89 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 
相關問題