Процедура или функция ожидает параметр, который не был предоставлен, когда параметр генерируется автоматически

Я пытаюсь вставить данные в свою БД. это код, который я использую

SqlCommand cmd = new SqlCommand("dbo.UsersInsert", cnn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@UserID", SqlDbType.Int);
cmd.Parameters.AddWithValue("@UserFirstName", FirstName.Text);
cmd.Parameters.AddWithValue("@UserMiddleName", MiddleName.Text);
cmd.Parameters.AddWithValue("@UserLastName", LastName.Text);

так далее...

Это дает мне ошибку

Процедура или функция «UsersInsert» ожидает параметр «@UserID», который не был предоставлен.

на cmd.ExecuteNonQuery(); линия.

Здесь мой идентификатор пользователя автоматически генерируется в моей базе данных. Как решить эту проблему?

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

 @UserID INT OUTPUT,   
 @UserFirstName VARCHAR (50),  
 @UserMiddleName VARCHAR (50),  
 @UserLastName VARCHAR (50), etc... 

AS  
SET NOCOUNT ON  
DECLARE @ReturnValue int  
BEGIN  

 SELECT @ReturnValue = 0  

 INSERT [Users]  
 ( 
            [UserFirstName]
           ,[UserMiddleName]
           ,[UserLastName] etc... 
 values (

         @UserFirstName,  
                 @UserMiddleName,  
                 @UserLastName,  etc.. )
IF (@@Error <> 0) GOTO ERROR_HANDLER

 GOTO OnExit  
END  

person user983983    schedule 27.09.2013    source источник
comment
я думаю, что вы не должны добавлять в качестве параметра   -  person Guru Stron    schedule 27.09.2013
comment
посмотрите на этот stackoverflow.com/a/10614457/2501279   -  person Guru Stron    schedule 27.09.2013


Ответы (2)


Вы должны сделать это ParameterDirection.Output

SqlParameter userIdParam = new SqlParameter("@UserID", SqlDbType.Int);
userIdParam.Direction = ParameterDirection.Output;
cmd.Parameters.Add(userIdParam);

Таким образом, вам не нужно указывать значение

person Jeroen van Langen    schedule 27.09.2013
comment
Я попробовал то, что вы сказали, теперь это дает мне ошибку преобразования типа данных nvarchar в int. эта ошибка. - person user983983; 27.09.2013
comment
Это означает, что ваша хранимая процедура определила параметр UserID как nvarchar. Или вы должны изменить хранимую процедуру на int, или вы должны изменить dbType SqlParameter на nvarchar. - person Jeroen van Langen; 27.09.2013
comment
Storedprocedure определила UserID как int. и я преобразовываю параметр в nvarchar, а затем выдает ошибку Ошибка преобразования типа данных int в nvarchar. Это очень расстраивает. - person user983983; 27.09.2013
comment
Где вы назначаете @UserID в хранимой процедуре? Я думаю, это будет DBNull. DBNull не может быть преобразован в int. Попробуйте установить в конце StoredProc SET @UserID = SCOPE_IDENTITY() - person Jeroen van Langen; 27.09.2013
comment
Пытался. Безрезультатно. :( Кстати, кто-нибудь знает, как редактировать функцию на сервере MS SQL? - person user983983; 27.09.2013

Следующий код должен работать, измените sql, чтобы принять параметры

SqlCommand cmd = new SqlCommand("dbo.UsersInsert @UserID out, @UserFirstName, @UserMiddleName, @UserLastName", cnn);

Затем измените параметры следующим образом

var id = new SqlParameter("UserID", System.Data.SqlDbType.Int);
id.Direction = System.Data.ParameterDirection.Output;
cmd.Parameters.Add(id);

cmd.Parameters.AddWithValue("UserFirstName", FirstName.Text);
cmd.Parameters.AddWithValue("UserMiddleName", MiddleName.Text);
cmd.Parameters.AddWithValue("UserLastName", LastName.Text);
person 3dd    schedule 19.06.2014