Я пытаюсь вставить данные в базу данных 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
В моем случае я получил это исключение даже тогда, когда все значения параметров были правильно поставлены, но типа команды не было указано :
cmd.CommandType = System.Data.CommandType.StoredProcedure;
Это явно не тот случай, в предыдущем вопросе, но исключение из описания не очень понятно в этом случае, поэтому я решил уточнить, что.
Я вчера по этому вопросу, но ни одно из решений здесь точно работал, но они сделали мне точку в правильном направлении.
Наше приложение рабочего процесса инструмент, написанный на C# и, чрезмерно упрощена, имеет несколько хранимых процедур в базе данных, а также таблицы метаданных о каждом параметре используется каждая хранимая процедура (название, порядок, тип данных, размер и т. д.), что позволяет нам создать столько новых хранимых процедур, как нам нужно, без необходимости изменения кода на C#.
Анализ проблемы показал, что наш код был настройки все правильные параметры на команду sqlcommand объект, как только он был выполнен, он бросил ту же ошибку, что ОП получил.
Дальнейший анализ показал, что некоторые параметры имели значение нуль
. Поэтому я должен сделать вывод, что свойство sqlcommand объекты игнорировать объект объект sqlparameter
в `.Коллекция параметров со значением "нуль".
Есть два решения этой проблемы, которое я нашел.
В нашем хранимых процедур, дать значение по умолчанию для каждого параметра, так и от параметра@инт " на " параметр@инт = нуль` (или другое значение по умолчанию, по мере необходимости).
В наш код, который создает объекты отдельных объектов sqlparameter
назначение значение dbnull.Значение
вместо нуль
, где значение является SQL нуль
делает трюк.
Оригинальный кодер и двинулся дальше, и код был изначально написан с раствором 1 в уме, и взвесив преимущества обоих, я думаю, я'МР палку с решением 1. Это'ы гораздо легче задать значение по умолчанию для конкретной хранимой процедуры при ее написании, нежели это всегда "нуль", как это определено в Кодексе.
Надеюсь, что помогает кто-то.
Хранимая процедура ожидает 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
В моем случае я получил ошибку на выходной параметр, хотя я сидел в нем правильно, на C# стороны, я понял, что я забыл дать значение по умолчанию для выходного параметра хранимой процедуры
ALTER PROCEDURE [dbo].[test]
(
@UserID int,
@ReturnValue int = 0 output --Previously I had @ReturnValue int output
)
В моем случае, это возвращался один выходной параметр и не возвращается никакого значения. Поэтому сменила его на
param.Direction = ParameterDirection.Output;
command.ExecuteScalar();
и тогда он бросал ошибка размера. поэтому пришлось установить размер также
SqlParameter param = new SqlParameter("@Name",SqlDbType.NVarChar);
param.Size = 10;