SQL Query dice que un parámetro no se proporciona, pero se agrega al object SqlCommand

Tengo un procedimiento almacenado que tiene un parámetro llamado UserName y en mi código subyace un object SqlCommand al que agrego los parameters con el método Add. Pero por algún motivo, cuando el object de command intenta ejecutar el método ExecuteReader, arroja una exception. Estoy totalmente perdido y no tengo idea de por qué no reconoce el parámetro. Antes de que se ejecute el método ExecuteReader, tengo un punto de ruptura establecido para poder confirmar que el object del command contiene los parameters que se están configurando, lo cual es cierto. Sé que el procedimiento almacenado devuelve los datos correctos cuando los parameters no se agregan al object de command, pero están codificados en el procedimiento almacenado real. A continuación se muestra el post de exception que se proporciona en el bloque catch. También pegaré mi código y la primera parte del procedimiento almacenado. Agradecería enormemente cualquier ayuda en este tema, ya que he intentado muchos enfoques diferentes en vano. Gracias por adelantado.

Mensaje de exception

El procedimiento o function 'someStonetworkingProcedure' espera el parámetro '@UserName', que no se suministró.

Código detrás

private DataTable GetLossMitData(string code, DateTime? start, DateTime? end) { DataTable results = new DataTable(); string connectionString = ConfigurationManager.ConnectionStrings["asdf"].ConnectionString; string userName = String.Empty; try { using (SPSite site = new SPSite(ConfigurationManager.AppSettings["someName"])) { using (SPWeb web = site.OpenWeb()) { userName = web.CurrentUser.Email.ToString(); } } using (SqlConnection connection1 = new SqlConnection(connectionString)) { connection1.Open(); using (SqlCommand command1 = new SqlCommand("someStonetworkingProcedure", connection1)) { command1.Parameters.Add(new SqlParameter("@UserName", userName)); command1.Parameters.Add(new SqlParameter("@ProductCode", code)); SqlDataReader dr = command1.ExecuteReader(CommandBehavior.CloseConnection); results.Load(dr); } connection1.Close(); } } catch (Exception ex) { } return results; } 

Procedimiento almacenado

 @UserName nvarchar(256), @ProductCode nvarchar(256), @StartDate nvarchar(256) = '1/1/1900', @EndDate nvarchar(256) = '12/30/2012' AS BEGIN SET NOCOUNT ON; Declare @UserID int Select @UserID = Users.UserID from Users where Users.Email = @UserName 

Intente asegurarse de que el tipo de command esté configurado en el procedimiento almacenado.

 mycommand.CommandType = System.Data.CommandType.StonetworkingProcedure; 

Obtendrá esta exception si el valor de su variable 'userName' es nulo

Si null es válido, pase 'DBNull.Value' a la database en su lugar:

 command1.Parameters.Add(new SqlParameter("@UserName", (userName ?? DBNull.Value)); 
 Command1.CommandType = System.Data.CommandType.StonetworkingProcedure 

Esto obligará al ExecuteReader a realizar el command en lugar de simplemente intentarlo como un command plano.

De forma pnetworkingeterminada, la propiedad CommandText necesita contener un command SQL completo, no solo el nombre del procedimiento almacenado.

Puede cambiar esto para establecer la propiedad CommandType SqlCommand en CommandType .

Alternativamente, puede pasar explícitamente los parameters, cambiando CommandText a "someStonetworkingProcedure @UserName, @ProductCode" ; esta es una statement SQL completa y funcionará con el CommandType of Text pnetworkingeterminado.

EDITAR : Acabo de CommandType , y la única forma de get ese post de error sin configurar CommandType en CommandType (que no hizo) es si CommandText es EXEC someStonetworkingProcedure . Pasar un parámetro null da un error diferente.