2009-07-29 7 views
6

Excel에서 VBA 스크립트를 사용하여 새 행을 테이블에 삽입 한 다음 해당 행의 ID 값을 다시 가져 오는 중입니다. 내가 실행하는 경우 :ADODB Recordset에서 SELECT SCOPE_IDENTITY() 사용

INSERT INTO DataSheet(databaseUserID, currentTimestamp) 
VALUES (1, CURRENT_TIMESTAMP); 
SELECT SCOPE_IDENTITY() 

를 Management Studio에서 행이 삽입되고 그것은 나에게 예상대로 반환 된 ID 값을 제공합니다. 그러나 VBA에서 ADODB 레코드 세트를 통해 동일한 쿼리를 실행할 때 문제가 발생합니다. 행이 실제로 삽입되었지만 ID 값에 액세스 할 수 없습니다. 레코드 세트는 0 개의 필드를 나열하고 실제로 닫혀 있습니다. 세미콜론을 사용하거나 사용하지 않으려 고 시도했지만, 쿼리를 단일 트랜잭션으로 실행하려고했습니다. 같은 거래요, 주사위도 없어요. 무슨 일이 일어나고 있는지 아십니까?

여기 내 VBA의 :

Dim rs As ADODB.Recordset 
Dim cn As Connection 
Dim SQLStr As String 
Dim serverName As String 
Dim databaseName As String 

serverName = "MSSQLServer" 
databaseName = "QA" 
cxnStr = "Driver={SQL Server};Server=" & serverName & ";Database=" & databaseName & ";" 

SQLStr = "INSERT INTO DataSheet(databaseUserID, currentTimestamp) 
VALUES (1, CURRENT_TIMESTAMP); SELECT SCOPE_IDENTITY()" 
Set cn = New ADODB.Connection 
cn.Open cxnStr 
Set rs = New ADODB.Recordset 
rs.Open SQLStr, cn, adOpenKeyset, adLockOptimistic 
MsgBox (rs.Fields(0).Value) 

그리고 메시지 상자가 rs.Fields(0).Value 반환 NULL 때문에 표시되지 않습니다. 내가 rs에 시계를 추가하고, 내가 말했듯이, 쿼리 후 0 필드를 보여줍니다 또한 닫힌 것으로 보인다 (상태 = 0).

답변

8

보십시오.

Set rs = rs.NextRecordset() 

트릭해야 다음과 일상의 끝을 변경 :

Set rs = New ADODB.Recordset 
rs.Open SQLStr, cn, adOpenKeyset, adLockOptimistic 
Set rs = rs.NextRecordset 
MsgBox (rs.Fields(0).Value) 
+0

아름다운! 완벽하게 작동합니다. 감사합니다! – JoeCool

0

adOpenKeySet 및 adLockOptimistic 값을 제거하면 기본값이 그대로 유지됩니다. 당신이 ADODB를 사용하여 명령의 배치를 실행하면 사용자의 rs.Open에서

1

내가이 별도로 각각의 실행 생각이

rs.Open SQLStr, cn, adCmdText

3

당신은 그래서 당신이 문을 실행하는 실행하기 위해 다음 명령을 강제로 다음 사용해야합니다 두 가지 결과가 다시 나타납니다. 레코드 집합 개체는 한 번에 하나의 결과 만 저장할 수 있습니다. 즉, NextRecordset 메서드를 사용해야하는 다른 결과를 얻을 수 있습니다.

Set rs = rs.NextRecordset