Подтвердить что ты не робот

SQL Query говорит, что параметр не указан, но добавляется к объекту SqlCommand

У меня есть хранимая процедура с параметром UserName и в моем коде позади у меня есть объект SqlCommand, который я добавляю к параметрам с помощью метода Add. Но по какой-то причине, когда объект команды пытается запустить метод ExecuteReader, он выдает исключение. Я полностью в недоумении и понятия не имею, почему он не распознает параметр. Перед запуском метода ExecuteReader у меня есть точка прерывания, поэтому я могу подтвердить, что объект команды содержит заданные параметры, что верно. Я знаю, что хранимая процедура возвращает правильные данные, когда параметры не добавляются в объект команды, но жестко закодированы в фактической хранимой процедуре. Ниже приведено сообщение об исключении, которое указано в блоке catch. Я также вставлю свой код и первую часть хранимой процедуры. Я был бы очень признателен за любую помощь в этом вопросе, поскольку я пробовал много разных подходов безрезультатно. Спасибо заранее.



Сообщение об исключении

Процедура или функция 'someStoredProcedure' ожидает параметр '@UserName', который не был указан.



Код за

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



Сохраненная процедура

@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
4b9b3361

Ответ 1

Попробуйте убедиться, что тип команды установлен в хранимую процедуру.

mycommand.CommandType = System.Data.CommandType.StoredProcedure;

Ответ 2

Вы получите это исключение, если значение переменной 'userName' равно null

Если значение null действителен, вместо этого передайте 'DBNull.Value' в db:

command1.Parameters.Add(new SqlParameter("@UserName", (userName ?? DBNull.Value));   

Ответ 3

По умолчанию свойство CommandText должно содержать полную команду SQL, а не только имя хранимой процедуры.

Вы можете изменить это, чтобы установить свойство SqlCommand CommandType в StoredProcedure.

В качестве альтернативы вы можете явно передать параметры, изменив CommandText на "someStoredProcedure @UserName, @ProductCode"; это полный оператор SQL и будет работать со значением по умолчанию CommandType Text.

EDIT: я просто попробовал, и единственный способ получить это сообщение об ошибке без установки CommandType в StoredProcedure (чего он не делал) - это если CommandText is EXEC someStoredProcedure. Передача параметра null дает другую ошибку.

Ответ 4

Command1.CommandType = System.Data.CommandType.StoredProcedure

Это заставит ExecuteReader выполнить exec вместо того, чтобы просто попробовать его как плоскую команду.