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

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



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

Процедура или функция '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
22
задан jhorton 17 February 2010 в 15:55
поделиться

4 ответа

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

mycommand.CommandType = System.Data.CommandType.StoredProcedure;
47
ответ дан 29 November 2019 в 03:47
поделиться
Command1.CommandType = System.Data.CommandType.StoredProcedure

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

3
ответ дан 29 November 2019 в 03:47
поделиться

С помощью управления IIS добавьте пользовательский заголовок Cache-Control со значением no-cache . Это заставит браузер проверить, что любая кэшированная версия XAP является последней перед ее использованием.

-121--1520218-

Документация MDN довольно хорошая, ИМО.

Функция, содержащая ключевое слово выхода, является генератором. Когда вы его называете, его формальные параметры привязаны к фактическим аргументам, но его тело на самом деле не оценивается. Вместо этого возвращается генератор-итератор. Каждый вызов следующего метода генератора-итератора () выполняет другой проход через итеративный алгоритм. Значение каждого шага - это значение, указанное ключевым словом выхода. Рассмотрим выход как генераторно-итераторную версию возврата, указывающую границу между каждой итерацией алгоритма. Каждый раз при вызове next () код генератора возвращается из инструкции, следующей за выходом.

-121--606055-

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

Это значение можно изменить, установив для свойства SqlCommand CommandType значение StoredProcedure .

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

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

3
ответ дан 29 November 2019 в 03:47
поделиться

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

Если null допустимо, то вместо этого передайте DBNull.Value в базу данных:

command1.Parameters.Add(new SqlParameter("@UserName", (userName ?? DBNull.Value));   
9
ответ дан 29 November 2019 в 03:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: