it-swarm.com.de

Die gespeicherte Prozedur oder Funktion erwartet Parameter, die nicht angegeben werden

Ich versuche, Daten in eine SQL Server-Datenbank einzufügen, indem ich eine gespeicherte Prozedur aufrufe, aber ich erhalte den Fehler

Die Prozedur oder Funktion 'SHOWuser' erwartet den Parameter '@userID', der nicht angegeben wurde.

Meine gespeicherte Prozedur heißt SHOWuser. Ich habe es gründlich überprüft und es fehlen keine Parameter.

Mein Code ist:

public void SHOWuser(string userName, string password, string emailAddress, List<int> preferences)
{
        SqlConnection dbcon = new SqlConnection(conn);

        try
        { 
            SqlCommand cmd = new SqlCommand();

            cmd.Connection = dbcon;
            cmd.CommandType = System.Data.CommandType.StoredProcedure;
            cmd.CommandText = "SHOWuser";

            cmd.Parameters.AddWithValue("@userName", userName);
            cmd.Parameters.AddWithValue("@password", password);
            cmd.Parameters.AddWithValue("@emailAddress", emailAddress);

            dbcon.Open();

            int i = Convert.ToInt32(cmd.ExecuteScalar());

            cmd.Parameters.Clear();
            cmd.CommandText = "tbl_pref";

            foreach (int preference in preferences)
            {
                cmd.Parameters.Clear();
                cmd.Parameters.AddWithValue("@userID", Convert.ToInt32(i));
                cmd.Parameters.AddWithValue("@preferenceID", Convert.ToInt32(preference));

                cmd.ExecuteNonQuery();
            }
        }
        catch (Exception)
        {
            throw;
        }
        finally
        {
            dbcon.Close();
        }

und die gespeicherte Prozedur ist:

ALTER PROCEDURE [dbo].[SHOWuser]
(
    @userName varchar(50),
    @password nvarchar(50),
    @emailAddress nvarchar(50)
)
AS
BEGIN
    INSERT INTO tbl_user(userName, password, emailAddress) 
    VALUES (@userName, @password, @emailAddress)

    SELECT
        tbl_user.userID, tbl_user.userName,
        tbl_user.password, tbl_user.emailAddress, 
        STUFF((SELECT ',' + preferenceName 
               FROM tbl_pref_master
               INNER JOIN tbl_preferences ON tbl_pref_master.preferenceID = tbl_preferences.preferenceID
               WHERE tbl_preferences.userID = tbl_user.userID
               FOR XML PATH ('')), 1, 1, ' ' ) AS Preferences
    FROM
        tbl_user

    SELECT SCOPE_IDENTITY();
END

Dies ist die zweite gespeicherte Prozedur tbl_pref, das in der gleichen Funktion verwendet wird:

ALTER PROCEDURE [dbo].[tbl_pref]
    @userID int,
    @preferenceID int
AS
BEGIN
    INSERT INTO tbl_preferences(userID, preferenceID) 
    VALUES (@userID, @preferenceID)
END
33
user2920046

Ihre gespeicherte Prozedur erwartet 5 Parameter als Eingabe

@userID int, 
@userName varchar(50), 
@password nvarchar(50), 
@emailAddress nvarchar(50), 
@preferenceName varchar(20) 

Fügen Sie diesem SP Aufruf also alle 5 Parameter hinzu:

    cmd.CommandText = "SHOWuser";
    cmd.Parameters.AddWithValue("@userID",userID);
    cmd.Parameters.AddWithValue("@userName", userName);
    cmd.Parameters.AddWithValue("@password", password);
    cmd.Parameters.AddWithValue("@emailAddress", emailAddress);
    cmd.Parameters.AddWithValue("@preferenceName", preferences);
    dbcon.Open();

PS: Es ist nicht klar, wozu diese Parameter dienen. Sie verwenden diese Parameter nicht in Ihrem SP Body, daher sollte Ihr SP so aussehen:

ALTER PROCEDURE [dbo].[SHOWuser] AS BEGIN ..... END
11
valex

In meinem Fall habe ich diese Ausnahme erhalten, obwohl alle Parameterwerte korrekt angegeben wurden, aber die Art des Befehls nicht angegeben wurde:

cmd.CommandType = System.Data.CommandType.StoredProcedure;

Dies ist in der obigen Frage offensichtlich nicht der Fall, aber die Beschreibung der Ausnahmen ist in diesem Fall nicht sehr klar, weshalb ich mich entschlossen habe, dies anzugeben.

151
Alex Krotnyi

Ich bin gestern auf dieses Problem gestoßen, aber keine der Lösungen hier hat genau funktioniert, aber sie haben mich in die richtige Richtung gelenkt.

Unsere Anwendung ist ein in C # geschriebenes Workflow-Tool, das vereinfacht mehrere gespeicherte Prozeduren in der Datenbank sowie eine Tabelle mit Metadaten zu jedem Parameter enthält, der von jeder gespeicherten Prozedur verwendet wird (Name, Reihenfolge, Datentyp, Größe usw.). So können wir beliebig viele neue gespeicherte Prozeduren erstellen, ohne das C # ändern zu müssen.

Die Analyse des Problems ergab, dass unser Code alle korrekten Parameter für das Objekt SqlCommand festlegte. Nach der Ausführung wurde jedoch derselbe Fehler ausgegeben, den das OP erhalten hat.

Weitere Analysen ergaben, dass einige Parameter einen Wert von null hatten. Ich muss daher den Schluss ziehen, dass SqlCommand -Objekte alle SqlParameter -Objekte in ihrer .Parameters - Auflistung mit dem Wert null ignorieren.

Es gibt zwei Lösungen für dieses Problem, die ich gefunden habe.

  1. Geben Sie in unseren gespeicherten Prozeduren jedem Parameter einen Standardwert, also von @Parameter int Bis @Parameter int = NULL (Oder einen anderen erforderlichen Standardwert).

  2. In unserem Code, der die einzelnen SqlParameter - Objekte generiert, reicht es aus, DBNull.Value Anstelle von null zuzuweisen, wobei der beabsichtigte Wert ein SQL-Wert NULL ist.

Der ursprüngliche Codierer wurde weiterentwickelt und der Code wurde ursprünglich unter Berücksichtigung von Lösung 1 geschrieben. Nachdem ich die Vorteile von beiden abgewogen habe, bleibe ich bei Lösung 1. Es ist viel einfacher, einen Standardwert für eine bestimmte gespeicherte Prozedur anzugeben beim Schreiben ist es nicht immer NULL, wie im Code definiert.

Hoffe das hilft jemandem.

35
ubercam

In meinem Fall ist der Fehler beim Ausgabeparameter aufgetreten, obwohl ich ihn auf der C # -Seite richtig eingestellt habe. Ich habe herausgefunden, dass ich vergessen habe, dem Ausgabeparameter für die gespeicherte Prozedur einen Standardwert zuzuweisen

ALTER PROCEDURE [dbo].[test]
(
                @UserID int,
                @ReturnValue int = 0 output --Previously I had @ReturnValue int output
)
4
Vbp

In meinem Fall gab es einen Ausgabeparameter zurück und keinen Wert.
Also änderte es zu

param.Direction = ParameterDirection.Output;
command.ExecuteScalar();

und dann warf es Größenfehler. so musste auch die größe eingestellt werden

SqlParameter param = new SqlParameter("@Name",SqlDbType.NVarChar);
param.Size = 10;
3
Dev