Domanda

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:

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 la stessa identica 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 0 campi ed è stato effettivamente chiuso. Ho provato con e senza il punto e virgola e ho anche provato a eseguire la query come singola transazione. Stesso affare, niente dadi. Hai idea di cosa stia succedendo?

Ecco il mio 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 viene visualizzata perché 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 chiuso (stato = 0).

È stato utile?

Soluzione

Quando esegui un batch di comandi utilizzando ADODB, credo che vengano eseguiti separatamente. Per forzare l'esecuzione del comando successivo, devi utilizzare quanto segue:

Set rs = rs.NextRecordset()

Modificare la fine della routine come segue dovrebbe fare il trucco:

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

Altri suggerimenti

Stai eseguendo due istruzioni in modo da ottenere due risultati. l'oggetto recordset può contenere solo un risultato alla volta: per ottenere l'altro risultato è necessario utilizzare il metodo NextRecordset.

Set rs = rs.NextRecordset

In rsOpen Prova questo

rs.Open SQLStr, cn, adCmdText

Guarda cosa succede quando rimuovi i valori adOpenKeySet e adLockOptimistic lasciandoli ai loro valori predefiniti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top