2009-05-11 13 views
0

J'ai un proc stocké sur une application tierce existante (SQL 2005) avec laquelle je souhaite interagir.Comment extraire une valeur d'un jeu d'enregistrements qui n'est pas une valeur de retour ou un paramètre de sortie utilisant vb6

Il s'agit d'une instruction d'insertion suivie d'une instruction select comme suit;

 
    Set @CustomerId = Cast(SCOPE_IDENTITY() As [int]) 

    Select @CustomerId 

Comment utiliser VB6 pour accéder à la valeur de @CustomerID?

set rs = cmd.Execute 

ne revient pas comme prévu un resultset ...

[Modifier]

rs.Fields.Count est 0.

Toute tentative d'accéder au résultat recordset , comme rs (0) .Value provoque simplement une erreur "Item not found ...".

+0

Qu'est-ce que * est * il retourne? – paxdiablo

+0

Ouais, qu'est-ce qu'il y a dans rs (0)? –

+0

Euh, les gars, il n'y a pas de rs (0). C'est la signification de rs.Fields.Count = 0, et l'erreur "Item not found". – MarkJ

Répondre

3

Je suppose que votre procédure stockée retourne plus d'un jeu d'enregistrements.

Si tel est le cas, vous pouvez utiliser la méthode NextRecordset() pour les parcourir.

MSDN:

  • Si une commande de ligne-retour exécute avec succès, mais ne renvoie aucun enregistrement, l'objet Recordset retourné sera ouvert mais vide. Testez ce cas par en vérifiant que les propriétés BOF et EOF sont toutes deux True.
  • Si une commande de non-retour de ligne s'exécute correctement, l'objet Recordset renvoyé sera fermé, ce que vous pouvez vérifier en testant la propriété State sur le jeu d'enregistrements.
  • Lorsqu'il n'y a plus de résultats, le jeu d'enregistrements est défini sur Nothing.

Cela signifie que je suggère quelque chose comme ceci pour résoudre votre problème:

Set rs = cmd.Execute 

''# fetch the first value of the last recordset 
Do Until rs Is Nothing 
    If rs.State = adStateOpen Then 
    If Not (rs.BOF And rs.EOF) Then 
     ''# You can do a different sanity check here, or none at all 
     If rs.Fields(0).Type = adInteger Then 
     CustomerId = rs.Fields(0).Value 
     End If 
    End If 
    End If 
    Set rs = rs.NextRecordSet 
Loop 

MsgBox CustomerId 
+0

Ce code semble avoir besoin d'un "rs.Ouvrir "appel juste après l'exécution pour le faire fonctionner? Est-ce exact ou est-ce que je manque quelque chose? –

+0

Lorsque vous exécutez une commande, vous obtenez un recorset (ou un groupe d'entre eux) de retour. qu'ils soient le résultat d'une opération de retour de ligne ou non, si l'un d'entre eux est fermé, cela signifie qu'il a été produit par un INSERT, par exemple, ce qui ne veut pas dire qu'il doit être ouvert. Le jeu d'enregistrements est ouvert, donc je vérifie simplement "If rs.State = adStateOpen" Tous les recordsets fermés ne contiennent pas beaucoup d'informations si ce n'est que leur instruction a été exécutée, ils peuvent être ignorés dans la boucle. – Tomalak