2009-07-29 17 views
6

Utilizzando uno script VBA in Excel, sto cercando di inserire una nuova riga in una tabella e quindi recuperare il valore dell'identità di quella riga. Se corro:Utilizzo di "SELEZIONA SCOPE_IDENTITY()" nel recordset ADODB

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

in Management Studio, la riga viene inserita e mi dà il valore di identità restituito come previsto. Tuttavia, quando eseguo esattamente la stessa query tramite un recordset ADODB in VBA, ho problemi. La riga è effettivamente inserita, ma non riesco ad accedere al valore dell'identità. Il recordset elenca i campi 0 ed è stato effettivamente chiuso. Ho provato con e senza il punto e virgola, e ho anche provato a eseguire la query come una singola transazione. Stesso affare, niente da fare. Qualche idea su cosa sta succedendo?

Ecco la mia 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) 

E la finestra di messaggio non riesce a visualizzare perché i rs.Fields(0).Value restituisce null. Ho aggiunto un orologio a rs e, come ho detto, mostra 0 campi dopo la query e sembra anche essere chiuso (stato = 0).

risposta

8

Quando si esegue un batch di comandi utilizzando ADODB, credo che corre ciascuno separatamente. Per forzare il comando successivo per l'esecuzione, è necessario utilizzare il seguente:

Set rs = rs.NextRecordset() 

Cambiare la fine della vostra routine al seguente dovrebbe fare il trucco:

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

Bello! Funziona perfettamente, grazie! – JoeCool

0

Vedere cosa succede quando si rimuovono i valori adOpenKeySet e adLockOptimistic lasciandoli ai valori predefiniti.

1

Nei tuoi rs.Open Prova questa

rs.Open SQLStr, cn, adCmdText

3

si sta eseguendo due affermazioni in modo da otterrà due risultati indietro. l'oggetto recordset può contenere solo un risultato alla volta - per ottenere l'altro risultato è necessario utilizzare il metodo NextRecordset.

Set rs = rs.NextRecordset 
Problemi correlati