2009-07-29 3 views
6

Mit einem VBA-Skript in Excel versuche ich eine neue Zeile in eine Tabelle einzufügen und dann den Identitätswert dieser Zeile zurück. Wenn ich:Verwenden von "SELECT SCOPE_IDENTITY()" in ADODB-Recordset

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

in Management Studio, wird die Zeile eingefügt und es gibt mir den zurückgegebenen Identitätswert wie erwartet. Wenn ich die genau dieselbe Abfrage über ein ADODB-Re-Cord-Set in VBA ausführe, habe ich jedoch Probleme. Die Zeile ist zwar eingefügt, aber ich kann nicht auf den Identity-Wert zugreifen. Das Re-Cord-Set listet 0 Felder auf und ist tatsächlich außerdem geschlossen worden. Ich habe es mit und ohne Semikolon versucht, und ich habe auch versucht, die Abfrage als eine einzige Transaktion auszuführen. Gleicher Deal, keine Würfel. Irgendeine Idee was ist los?

Hier ist meine 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) 

und das Meldungsfeld nicht angezeigt werden, da die rs.Fields(0).Value NULL zurück. Ich fügte rs eine Uhr hinzu und zeigt, wie gesagt, 0 Felder nach der Abfrage und scheint auch geschlossen zu sein (state = 0).

Antwort

8

Wenn Sie einen Stapel von Befehlen ADODB laufen, ich glaube, es ist jeder läuft ein separat. Um den nächsten Befehl zwingen zu laufen, müssen Sie verwenden die folgenden:

Set rs = rs.NextRecordset() 

ändern Ende Ihrer Routine der folgenden sollte es tun:

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

Schön! Funktioniert perfekt, danke! – JoeCool

0

Sehen Sie, was passiert, wenn Sie die adOpenKeySet- und adLockOptimistic-Werte entfernen, lassen Sie sie auf ihren Standardwerten.

1

In Ihrem rs.Open Versuchen Sie, diese

rs.Open SQLStr, cn, adCmdText

3

Sie ausgeführt werden zwei Anweisungen, so dass Sie erhält zwei Ergebnisse zurück. Das Recordset-Objekt kann nur jeweils ein Ergebnis enthalten. Um das andere Ergebnis zu erhalten, müssen Sie die NextRecordset-Methode verwenden.

Set rs = rs.NextRecordset