2009-07-29 32 views
6

Użycie skryptu VBA w programie Excel, próbuję wstawić nowy wiersz do tabeli, a następnie uzyskać wartość tożsamości tego wiersza. Jeśli uruchomię:Używanie "SELECT SCOPE_IDENTITY()" w zestawie rekordów ADODB

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

w Management Studio, wiersz jest wstawiany i daje mi zwróconą wartość tożsamości zgodnie z oczekiwaniami. Jednak po uruchomieniu dokładnie tego samego zapytania za pomocą zestawu rekordów ADODB w języku VBA mam problemy. Wiersz jest rzeczywiście wstawiany, ale nie mogę uzyskać dostępu do wartości tożsamości. Zestaw rekordów zawiera listę 0 pól i został również zamknięty. Próbowałem już z średnikiem i bez niego, a także próbowałem uruchomić kwerendę jako pojedynczą transakcję. Taki sam układ, żadnych kości. Masz pojęcie, co się dzieje?

Oto mój 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) 

A okno komunikatu nie wyświetli ponieważ rs.Fields(0).Value zwraca NULL. Dodałem zegarek do rs i, jak powiedziałem, pokazuje 0 pól po zapytaniu, a także wydaje się być zamknięty (stan = 0).

Odpowiedz

8

Po uruchomieniu partię poleceń za pomocą ADODB, uważam, że każdy z nich działa osobno. Aby wymusić kolejną komendę, aby uruchomić, trzeba użyć następujących:

Set rs = rs.NextRecordset() 

Zmiana koniec rutyny do poniższych powinno załatwić sprawę:

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

Piękna! Działa doskonale, dzięki! – JoeCool

0

Zobacz, co stanie się, gdy usuniesz adOpenKeySet, a wartości adLockOptimistic zostawią wartości domyślne.

1

W swoim rs.Open Spróbuj

rs.Open SQLStr, cn, adCmdText

3

Państwo realizują dwa oświadczenia więc otrzyma dwa wyniki z powrotem. Obiekt zestawu rekordów może pomieścić tylko jeden wynik naraz - aby uzyskać inny wynik, należy użyć metody NextRecordset.

Set rs = rs.NextRecordset