Abrufen des gespeicherten Prozedurausgabeparameters über ADO

Ich bleibe hier schon seit mehr als 48 Stunden. Ich versuche, einen Ausgabeparameterwert mit ADO-objecten abzurufen. hier ist mein vba code

Function ExecuteCommand(cSp As String, aParameters As Variant) As Integer Dim lnReturn As Integer Dim loCommand As ADODB.Command Dim prm As ADODB.Parameter Dim rds As ADODB.Recordset Set loCommand = New ADODB.Command loCommand.CommandText = cSp loCommand.CommandType = adCmdStoredProc Set loCommand.ActiveConnection = goConnection loCommand.NamedParameters = True Dim iCount As Integer For iCount = LBound(aParameters) To UBound(aParameters) If aParameters(iCount, 0) <> "" Then If aParameters(iCount, 1) = adNumeric Then Set prm = loCommand.CreateParameter(aParameters(iCount, 0), aParameters(iCount, 1), adParamInput) prm.Precision = 18 prm.NumericScale = 0 prm.Value = aParameters(iCount, 3) Else Set prm = loCommand.CreateParameter(aParameters(iCount, 0), aParameters(iCount, 1), adParamInput, , aParameters(iCount, 3)) End If loCommand.Parameters.Append prm End If Next Set prm = loCommand.CreateParameter("@returnval", adInteger, adParamOutput, , lnReturn) loCommand.Parameters.Append prm Set rds = loCommand.Execute ' Check the value of lnReturn and it's zero here. lnReturn = loCommand.Parameters("@returnval").Value ExecuteCommand = lnReturn End Function 

Meine gespeicherte Prozedur wie folgt …

 USE [table_name] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER PROCEDURE [dbo].[spname] @para1 int, @para2 int, @para3 int, @returnval int Output AS BEGIN SET NOCOUNT ON; SELECT * FROM type_table WHERE type1=@para1 and type2=@para2 and type3=@para3 SET @returnval = @@ROWCOUNT RETURN @returnval END 

Das sind meine Erkenntnisse

 lnReturn = 0 always rds.EOF = False rds.RecordCount = -1 

Meine Frage ist, ich bin nicht immer die richtige betroffenen Zeile zählen, die 1. Ich bin nicht sicher, was ist falsch mit dem Code und kann jemand mir eine Hand geben?

Solutions Collecting From Web of "Abrufen des gespeicherten Prozedurausgabeparameters über ADO"

Dies liegt wahrscheinlich daran, dass, wie Technet sagt, im Fall von Ausgabeparametern und Rückgabewerten die Werte nicht zurückgegeben werden, bis die data des Recordset-objects vollständig abgerufen wurden oder das Recordset geschlossen wurde.

Entweder schließen Sie Ihr RecordSet ( rds.Close ), wenn Sie nicht an den data interessiert sind, die von der SELECT-statement zurückgegeben werden, oder durchschleifen, bis Sie alle Zeilen gelesen haben.

Als beiseite, wenn Sie sich nie für die von der select-statement zurückgegebenen data interessieren, nur die Zeilenzahl, dann ist es effizienter, sie nicht zurückzugeben. Also, wenn du deinen SP ändern kannst, kannst du ihn ändern zu:

 SELECT @returnval = COUNT(*) FROM type_table WHERE type1=@para1 and type2=@para2 and type3=@para3 

Nach dem Entfernen von SET NOCOUNT ON; versuchen SET NOCOUNT ON; von deinem Verfahren

Ich denke, das wird dir helfen. Die betroffene SET NOCOUNT ON; wird nicht zurückgegeben, wenn Sie SET NOCOUNT ON; im Verfahren.

Wenn Sie kein Recordset als Teil Ihres gespeicherten Prozeduraufrufs erwarten, verwenden Sie cmd1-> Execute (NULL, NULL, ADO :: adExecuteNoRecords);