2009-05-11 6 views
0

Ich habe ein gespeichertes Proc auf einer vorhandenen 3rd-Party-Anwendung (SQL 2005), mit der ich interagieren möchte.So rufen Sie einen Wert aus einem Recordset ab, das kein Rückgabewert oder Ausgabeparameter ist vb6

Es ist eine Insert-Anweisung gefolgt von einer Select-Anweisung wie folgt;

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

    Select @CustomerId 

Mit VB6 Wie kann ich den Wert von @CustomerID zugreifen?

set rs = cmd.Execute 

kehrt keine resultset wie erwartet ...

[Bearbeiten]

rs.Fields.Count ist 0.

Jeder Versuch, das resultierende Recordset zuzugreifen , wie rs (0) .Wert verursacht einfach einen Fehler "Artikel nicht gefunden ...".

+0

Was * ist * it Rückkehr? – paxdiablo

+0

Ja, was ist in rs (0)? –

+0

Ähm, Leute, es gibt keine rs (0). Das ist die Bedeutung von rs.Fields.Count = 0 und der Fehler "Artikel nicht gefunden". – MarkJ

Antwort

3

Ich würde vermuten, dass Ihre gespeicherte Prozedur mehr als ein Recordset zurückgibt. In diesem Fall können Sie die Methode NextRecordset() verwenden, um sie zu durchlaufen.

MSDN:

  • Wenn eine Zeile-Rückkehr-Befehl erfolgreich ausgeführt wird, gibt aber keine Aufzeichnungen, die zurück Cord-Objekt wird offen, aber leer sein. Testen Sie für diesen Fall, indem Sie überprüfen, ob die Eigenschaften BOF und EOF beide True sind.
  • Wenn ein non-row-returning-Befehl erfolgreich ausgeführt wird, wird das zurückgegebene Re-Cord-Set-Objekt geschlossen, das Sie überprüfen können, indem Sie die State Eigenschaft auf dem Re-Cord-Set testen.
  • Wenn keine Ergebnisse mehr vorhanden sind, wird Recordset auf Nothing festgelegt.

Das bedeutet, dass ich so etwas wie dies würde vorschlagen, Ihr Problem zu lösen:

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

Dieser Code scheint ein "rs.Open "Call direkt nach dem Ausführen, um es zum Laufen zu bringen? Ist das richtig oder fehlt mir etwas? –

+0

Wenn Sie einen Befehl ausführen, erhalten Sie ein Recorset (oder eine Reihe von ihnen) zurück. Sie sind offen oder geschlossen, je nachdem ob sie das Ergebnis einer Zeilenrückgabe sind oder nicht: Wenn eine davon geschlossen ist, bedeutet dies, dass sie zum Beispiel von einem INSERT erzeugt wurde. Das bedeutet nicht, dass sie geöffnet werden muss. Ihre SELECT-Anweisung ist eine Zeile. Das angehängte Recordset wird geöffnet sein, also suche ich nach "If rs.State = adStateOpen". Alle geschlossenen Recordsets enthalten nur die Information, dass ihre Anweisung ausgeführt wurde. Sie können in der Schleife übersprungen werden. – Tomalak

Verwandte Themen