Return-Wert einer gespeicherten Prozedur in C# gibt Fehler
Ich versuche zum abrufen der return-Wert einer gespeicherten Prozedur in SQL Server 2005 wie folgt:
OleDbCommand comm = new OleDbCommand(process_name, connection);
comm.CommandType = CommandType.StoredProcedure;
for (int i = 0; i < process_parameters.Length; i++)
comm.Parameters.AddWithValue(process_parameters[i].ParameterName, process_parameters[i].Value);
//Add output param
comm.Parameters.Add("@TestID", OleDbType.Integer).Direction = ParameterDirection.ReturnValue;
comm.ExecuteNonQuery();
Wenn ExecuteNonQuery() aufgerufen, allerdings bekomme ich wieder eine OleDbException sagen: "Prozedur oder Funktion myStoredProcedure hat zu viele Argumente angegeben." Meine gespeicherten Prozedur wie folgt beginnt:
ALTER PROCEDURE [dbo].[spTabtempTestsINSERT]
(
@Param1 char (64),
@Param2 char (128),
@Param3 char (64),
)
AS
BEGIN
Declare @TestID int
Und endet mit der folgenden:
RETURN @TestID
END
Bedeutet die Tatsache, dass der Rückgabewert deklariert, anstatt als parameter übergeben werden, haben nichts zu tun mit es? Wenn ja, wie bekomme ich den return-Wert einer der Parameter, die erklärt, nachdem die gespeicherte Prozedur beginnt? Vielen Dank für Ihre Hilfe.
UPDATE:
Ich habe versucht, die vorgeschlagenen änderungen so weit, ich habe die folgende Zeile:
OleDbCommand comm = new OleDbCommand(process_name, connection);
comm.CommandType = CommandType.StoredProcedure;
for (int i = 0; i < process_parameters.Length; i++)
comm.Parameters.AddWithValue(process_parameters[i].ParameterName, process_parameters[i].Value);
var testID = (int)comm.ExecuteScalar();
Nun, wenn ExecuteScalar()
ausgeführt, ich bekomme eine NullReferenceException mit der Objektverweis wurde nicht auf eine Instanz eines Objekts.
Hinweis: ich habe auch versucht, wenn er auf einen integer int testID = (int)comm.ExecuteScalar();
und ich bekomme immer noch den gleichen Fehler.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ändern
zu
Und entfernen:
Dachte ich ExecuteNonQuery() nichts zurückgibt, aus SQL..... bin ich hier etwas fehlt?
entfernen Sie diese:
und diese stattdessen zu verwenden:
var testID = (int) comm.ExecuteScalar();
Ok, ich war in der Lage, es zu bekommen, um richtig zu arbeiten. Mein problem war, dass ich es versäumt, deklarieren Sie alle Parameter als AUSGABE habe ich eine zusätzliche variable, und die output-variable und hatte die gespeicherte Prozedur zurückgeben. Nach dem Wort habe ich gerade überprüft, dass die output-parameter nach dem Aufruf der gespeicherten Prozedur, von meinem C# - code die folgende Abbildung zeigt die Veränderungen:
Und am Ende machen eine einfache änderung:
Schließlich, zurück in mein code:
Danke Euch allen für Eure Vorschläge. Alternativen oder weitere Erkenntnisse sind willkommen.
In Reaktion auf die akzeptierten Antworten...
Weil Sie die Einstellung des Parameters
Direction
zuReturnValue
hier:Brauchen Sie nicht eine
OUTPUT
parameter in der gespeicherten Prozedur auf alle. Sie könnte sich ändern, es zurück zu:Mit:
am Ende und es würde immer noch genau so funktioniert, wie Sie es jetzt tut.
Ist es rein zufällig, dass Ihr
ReturnValue
Parameter
in C# trägt den gleichen Namen wie IhreOUTPUT
parameter. Es gibt einen separaten parameterDirection
fürOUTPUT
Parameter.Ich hatte das gleiche Problem, das problem ist, dass Sie haben zu erklären, dass die return-parameter ersten (vor den Eingang und Ausgang sind), auf diese Weise funktioniert es: