Question

À l'aide d'un script VBA dans Excel, j'essaie d'insérer une nouvelle ligne dans une table, puis de récupérer la valeur d'identité de cette ligne. Si je cours:

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

dans Management Studio, la ligne est insérée et me donne la valeur d'identité renvoyée comme prévu. Cependant, lorsque j'exécute exactement la même requête via un jeu d'enregistrements ADODB dans VBA, j'ai des problèmes. La ligne est bien insérée, mais je ne peux pas accéder à la valeur d'identité. Le jeu d'enregistrements répertorie 0 champs et a également été fermé. J'ai essayé avec et sans point-virgule et j'ai également essayé d'exécuter la requête en tant que transaction unique. Même affaire, pas de dés. Une idée de ce qui se passe?

Voici mon 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)

Et la boîte de message ne s’affiche pas car le rs.Fields (0) .Value renvoie NULL. J'ai ajouté une montre à rs et, comme je l'ai dit, affiche 0 champ après la requête et semble également être fermé (état = 0).

Était-ce utile?

La solution

Lorsque vous exécutez un lot de commandes à l'aide d'ADODB, je pense que chacune d'entre elles est exécutée séparément. Pour forcer l'exécution de la commande suivante, vous devez utiliser les éléments suivants:

Set rs = rs.NextRecordset()

Modifiez la fin de votre routine comme suit devrait faire l'affaire:

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

Autres conseils

Vous exécutez deux instructions pour obtenir deux résultats. l'objet recordset ne peut contenir qu'un résultat à la fois. Pour obtenir l'autre résultat, vous devez utiliser la méthode NextRecordset.

Set rs = rs.NextRecordset

Dans vos dossiers ouverts Essayez ceci

rs.Open SQLStr, cn, adCmdText

Voyez ce qui se passe lorsque vous supprimez les valeurs adOpenKeySet et adLockOptimistic de les laisser à leurs valeurs par défaut.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top