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é.
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).En nuestro código que genera los objetos
SqlParameter
individuales, la asignación deDBNull.Value
lugar denull
donde el valor previsto es un SQLNULL
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