c# - proporcionado - SQL Query dice que un parámetro no se proporciona, pero se agrega al objeto SqlCommand
sqlconnection conn new sqlconnection (4)
De forma predeterminada, la propiedad CommandText
necesita contener un comando 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 parámetros, cambiando CommandText
a "someStoredProcedure @UserName, @ProductCode"
; esta es una declaración SQL completa y funcionará con el CommandType
of Text
predeterminado.
EDITAR : Acabo de CommandType
, y la única forma de obtener ese mensaje de error sin configurar CommandType
en CommandType
(que no hizo) es si CommandText
es EXEC someStoredProcedure
. Pasar un parámetro null
da un error diferente.
Tengo un procedimiento almacenado que tiene un parámetro llamado UserName y en mi código subyace un objeto SqlCommand al que agrego los parámetros con el método Add. Pero por algún motivo, cuando el objeto de comando intenta ejecutar el método ExecuteReader, arroja una excepción. 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 objeto del comando contiene los parámetros que se están configurando, lo cual es cierto. Sé que el procedimiento almacenado devuelve los datos correctos cuando los parámetros no se agregan al objeto de comando, pero están codificados en el procedimiento almacenado real. A continuación se muestra el mensaje de excepción 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 excepción
El procedimiento o función ''someStoredProcedure'' 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("someStoredProcedure", 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 comando esté configurado en el procedimiento almacenado.
mycommand.CommandType = System.Data.CommandType.StoredProcedure;
Obtendrá esta excepción si el valor de su variable ''userName'' es nulo
Si null es válido, pase ''DBNull.Value'' a la base de datos en su lugar:
command1.Parameters.Add(new SqlParameter("@UserName", (userName ?? DBNull.Value));
Command1.CommandType = System.Data.CommandType.StoredProcedure
Esto obligará al ExecuteReader a realizar el comando en lugar de simplemente intentarlo como un comando plano.