Хранимая процедура или функция ожидает параметр, который не указан

Я пытаюсь вставить данные в базу данных SQL Server с вызовом хранимой процедуры, но я получаю ошибку

процедура или функция 'форума -- мошенник' ожидает параметр '@имя пользователя', которая не была поставлена.

Моя хранимая процедура называется форума -- мошенник. Я проверил его тщательно и без параметров отсутствует.

Мой код:

public void SHOWuser(string userName, string password, string emailAddress, List<int> preferences)
{
        SqlConnection dbcon = new SqlConnection(conn);

        try
        { 
            SqlCommand cmd = new SqlCommand();

            cmd.Connection = dbcon;
            cmd.CommandType = System.Data.CommandType.StoredProcedure;
            cmd.CommandText = "SHOWuser";

            cmd.Parameters.AddWithValue("@userName", userName);
            cmd.Parameters.AddWithValue("@password", password);
            cmd.Parameters.AddWithValue("@emailAddress", emailAddress);

            dbcon.Open();

            int i = Convert.ToInt32(cmd.ExecuteScalar());

            cmd.Parameters.Clear();
            cmd.CommandText = "tbl_pref";

            foreach (int preference in preferences)
            {
                cmd.Parameters.Clear();
                cmd.Parameters.AddWithValue("@userID", Convert.ToInt32(i));
                cmd.Parameters.AddWithValue("@preferenceID", Convert.ToInt32(preference));

                cmd.ExecuteNonQuery();
            }
        }
        catch (Exception)
        {
            throw;
        }
        finally
        {
            dbcon.Close();
        }

и хранимая процедура:

ALTER PROCEDURE [dbo].[SHOWuser]
(
    @userName varchar(50),
    @password nvarchar(50),
    @emailAddress nvarchar(50)
)
AS
BEGIN
    INSERT INTO tbl_user(userName, password, emailAddress) 
    VALUES (@userName, @password, @emailAddress)

    SELECT
        tbl_user.userID, tbl_user.userName,
        tbl_user.password, tbl_user.emailAddress, 
        STUFF((SELECT ',' + preferenceName 
               FROM tbl_pref_master
               INNER JOIN tbl_preferences ON tbl_pref_master.preferenceID = tbl_preferences.preferenceID
               WHERE tbl_preferences.userID = tbl_user.userID
               FOR XML PATH ('')), 1, 1, ' ' ) AS Preferences
    FROM
        tbl_user

    SELECT SCOPE_IDENTITY();
END

Это tbl_pref второй хранимой процедуры``, который используется в той же функции:

ALTER PROCEDURE [dbo].[tbl_pref]
    @userID int,
    @preferenceID int
AS
BEGIN
    INSERT INTO tbl_preferences(userID, preferenceID) 
    VALUES (@userID, @preferenceID)
END
Комментарии к вопросу (15)

В моем случае я получил это исключение даже тогда, когда все значения параметров были правильно поставлены, но типа команды не было указано :

cmd.CommandType = System.Data.CommandType.StoredProcedure;

Это явно не тот случай, в предыдущем вопросе, но исключение из описания не очень понятно в этом случае, поэтому я решил уточнить, что.

Комментарии (3)

Я вчера по этому вопросу, но ни одно из решений здесь точно работал, но они сделали мне точку в правильном направлении.

Наше приложение рабочего процесса инструмент, написанный на C# и, чрезмерно упрощена, имеет несколько хранимых процедур в базе данных, а также таблицы метаданных о каждом параметре используется каждая хранимая процедура (название, порядок, тип данных, размер и т. д.), что позволяет нам создать столько новых хранимых процедур, как нам нужно, без необходимости изменения кода на C#.

Анализ проблемы показал, что наш код был настройки все правильные параметры на команду sqlcommand объект, как только он был выполнен, он бросил ту же ошибку, что ОП получил.

Дальнейший анализ показал, что некоторые параметры имели значение нуль. Поэтому я должен сделать вывод, что свойство sqlcommand объекты игнорировать объект объект sqlparameter в `.Коллекция параметров со значением "нуль".

Есть два решения этой проблемы, которое я нашел.

  1. В нашем хранимых процедур, дать значение по умолчанию для каждого параметра, так и от параметра@инт " на " параметр@инт = нуль` (или другое значение по умолчанию, по мере необходимости).

  2. В наш код, который создает объекты отдельных объектов sqlparameter назначение значение dbnull.Значение вместо нуль, где значение является SQL нуль делает трюк.

Оригинальный кодер и двинулся дальше, и код был изначально написан с раствором 1 в уме, и взвесив преимущества обоих, я думаю, я'МР палку с решением 1. Это'ы гораздо легче задать значение по умолчанию для конкретной хранимой процедуры при ее написании, нежели это всегда "нуль", как это определено в Кодексе.

Надеюсь, что помогает кто-то.

Комментарии (3)
Решение

Хранимая процедура ожидает 5 параметров в качестве входных данных

@userID int, 
@userName varchar(50), 
@password nvarchar(50), 
@emailAddress nvarchar(50), 
@preferenceName varchar(20) 

Так что вы должны добавить всех 5 параметров в этой СП телефонам:

    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();

ЗЫ: это's не ясно, что этих параметров для. Вы Don'т использовать эти параметры в СП тела, так что ваш СП должна выглядеть как:

ALTER PROCEDURE [dbo].[SHOWuser] AS BEGIN ..... END
Комментарии (6)

В моем случае я получил ошибку на выходной параметр, хотя я сидел в нем правильно, на C# стороны, я понял, что я забыл дать значение по умолчанию для выходного параметра хранимой процедуры

ALTER PROCEDURE [dbo].[test]
(
                @UserID int,
                @ReturnValue int = 0 output --Previously I had @ReturnValue int output
)
Комментарии (0)

В моем случае, это возвращался один выходной параметр и не возвращается никакого значения. Поэтому сменила его на

param.Direction = ParameterDirection.Output;
command.ExecuteScalar();

и тогда он бросал ошибка размера. поэтому пришлось установить размер также

SqlParameter param = new SqlParameter("@Name",SqlDbType.NVarChar);
param.Size = 10;
Комментарии (0)