Solución:
En mi caso, recibí esta excepción incluso cuando todos los valores de los parámetros se proporcionaron correctamente pero no se especificó el tipo de comando:
cmd.CommandType = System.Data.CommandType.StoredProcedure;
Obviamente, este no es el caso en la pregunta anterior, pero la descripción de la excepción no es muy clara en este caso, por lo que decidí especificar eso.
Me encontré con este problema ayer, pero ninguna de las soluciones aquí funcionó exactamente, sin embargo, me indicaron la dirección correcta.
Nuestra aplicación es una herramienta de flujo de trabajo escrita en C # y, excesivamente 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 SqlCommand
objeto, sin embargo, una vez que se ejecutó, arrojó el mismo error que obtuvo el OP.
Un análisis más detallado reveló que algunos parámetros tenían un valor de null
. Por tanto, debo sacar la conclusión de que SqlCommand
los objetos ignoran cualquier SqlParameter
objeto en su .Parameters
colección con un valor de null
.
Hay dos soluciones a este problema que encontré.
-
En nuestros procedimientos almacenados, asigne un valor predeterminado a cada parámetro, por lo que desde
@Parameter int
para@Parameter int = NULL
(o algún otro valor predeterminado según sea necesario). -
En nuestro código que genera al individuo
SqlParameter
objetos, asignandoDBNull.Value
en lugar denull
donde el valor deseado es un SQLNULL
Hace el truco.
El codificador original ha avanzado y el código se escribió originalmente con la Solución 1 en mente, 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 a 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é sirven estos parámetros. No usa estos parámetros en su cuerpo SP, por lo que su SP debería verse así:
ALTER PROCEDURE [dbo].[SHOWuser] AS BEGIN ..... END