2017-02-27 2 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이다 -는 연결 개체 레코드가 삽입 된 기록 중 하나를 볼 수 없습니다 나에게 나타납니다.

+0

전역 범위를 지정하려면 '## TEMP'를 사용해야합니다. – Lankymart

+0

[SQL Server에서 임시 테이블의 범위] 가능한 복제본 (http://stackoverflow.com/questions/18614344/scope-of-temporary-tables-in-sql-server) – Lankymart

+0

[http]이 될 수 있지만 (http : //stackoverflow.com/a/37073685/692942), SET NOCOUNT ON;을 설정해보십시오. – Lankymart

답변

1

나는 당신이 delete 문을 실행하기 전에 레코드 셋을 닫지 않는다고 생각한다. 나는 또한 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