ver valor stored salida retornar resueltos procedimientos procedimiento parametros fecha ejercicios ejecutar devolver datos con codigo almacenados almacenado sql sql-server stored-procedures

sql - valor - El procedimiento almacenado o función espera el parámetro que no se suministra



retornar valor stored procedure sql server (5)

Intento insertar datos en una base de datos de SQL Server llamando a un procedimiento almacenado, pero obtengo el error

El procedimiento o función ''SHOWuser'' espera el parámetro ''@userID'', que no se suministró.

Mi procedimiento almacenado se llama SHOWuser . Lo he revisado a fondo y no me faltan parámetros.

Mi código es:

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(); }

y el procedimiento almacenado es:

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

Este es el segundo procedimiento almacenado tbl_pref que se usa en la misma función:

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


En mi caso obtuve el error en el parámetro de salida aunque lo estaba configurando correctamente en el lado C # Me di cuenta de que olvidé dar un valor predeterminado para el parámetro de salida en el procedimiento almacenado

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


En mi caso, devolvía un parámetro de salida y no devolvía ningún valor.
Así que lo cambié a

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

y luego estaba arrojando un error de tamaño. así que también tuve que establecer el tamaño

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


En mi caso, recibí esta excepción incluso cuando todos los valores de los parámetros se suministraron correctamente, pero no se especificó el tipo de comando:

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

Esto obviamente no es el caso en la pregunta anterior, pero la descripción de la excepción no es muy clara en este caso, así que decidí especificar eso.


Me encontré con este problema ayer, pero ninguna de las soluciones aquí funcionó exactamente, sin embargo, me señalaron en la dirección correcta.

Nuestra aplicación es una herramienta de flujo de trabajo escrita en C # y simplificada, tiene varios procedimientos almacenados en la base de datos, así como una tabla de metadatos sobre cada parámetro utilizado por cada procedimiento almacenado (nombre, orden, tipo de datos, tamaño, etc.). permitiéndonos crear tantos procedimientos almacenados nuevos como necesitemos sin tener que cambiar el C #.

El análisis del problema mostró que nuestro código estaba configurando todos los parámetros correctos en el objeto SqlCommand , sin embargo, una vez que se ejecutó, arrojó el mismo error que el OP.

Un análisis más detallado reveló que algunos parámetros tenían un valor de null . Por lo tanto, debo sacar la conclusión de que los objetos SqlCommand ignoran cualquier objeto SqlParameter en su colección .Parameters con un valor null .

Hay dos soluciones a este problema que encontré.

  1. En nuestros procedimientos almacenados, proporcione un valor predeterminado para cada parámetro, por lo tanto, de @Parameter int a @Parameter int = NULL (o de algún otro valor predeterminado, según corresponda).

  2. En nuestro código que genera los objetos SqlParameter individuales, la asignación de DBNull.Value lugar de null donde el valor previsto es un SQL NULL hace el truco.

El codificador original ha avanzado y el código se escribió originalmente teniendo en cuenta la Solución 1, y habiendo sopesado los beneficios de ambos, creo que me quedaré con la Solución 1. Es mucho más fácil especificar un valor predeterminado para un procedimiento almacenado específico. al escribirlo, en lugar de que siempre sea NULL como se define en el código.

Espero que ayude a alguien.


Su procedimiento almacenado espera 5 parámetros como entrada

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

Por lo tanto, debe agregar los 5 parámetros a esta llamada SP:

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();

PD: No está claro para qué son estos parámetros. No utiliza estos parámetros en su cuerpo de SP para que su SP se vea así:

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