Ожидает параметр '@ID', который не был указан?

Я отправляю идентификатор в качестве внешнего, но его сообщение об ошибке

System.Data.SqlClient.SqlException: процедура или функция 'usp_ClientHistoryItem' ожидает параметр '@ID', который не был в комплект поставки.

Код

 using (SqlCommand cmd = new SqlCommand("dbo.usp_ClientHistoryItem", conn))
 {
      SqlParameter parameterID = new SqlParameter("@ID", oReservation.Id);
      parameterID.Direction = ParameterDirection.Output;
      cmd.Parameters.Add(parameterID); 

      cmd.Parameters.Add(new SqlParameter("@PhoneNo", oReservation.ClientPhone));
      cmd.Parameters.Add(new SqlParameter("@UserId", oReservation.UserID));
      cmd.Parameters.Add(new SqlParameter("@Description", oReservation.Description));
      cmd.Parameters.Add(new SqlParameter("@TestId", oReservation.TestId));
      cmd.Parameters.Add(new SqlParameter("@StartDate", oReservation.StartDate));

      cmd.ExecuteNonQuery();

      returnValue = Convert.ToInt32(cmd.Parameters["@ID"].Value);

      return returnValue;
}

Ответы

Ответ 1

Кажется, вы вызываете хранимую процедуру, но вы никогда не определяете свой SqlCommand как хранимую процедуру:

using (SqlCommand cmd = new SqlCommand("dbo.usp_ClientHistoryItem", conn))
{
    cmd.CommandType = CommandType.StoredProcedure;  // add this line to tell ADO.NET it a stored procedure!!

Если вы забудете эту строку, ADO.NET попытается интерпретировать ваш материал как специальный SQL-запрос....

Ответ 2

Параметр ID в хранимой процедуре должен быть установлен как параметр OUTPUT. Вы просто устанавливаете его в коде не в хранимой процедуре.

Ответ 3

эта проблема решает мою проблему может быть, это может быть полезно

cmd.CommandType = CommandType.StoredProcedure;

Ответ 4

Ги парни.

Вы должны установить свойство CommandType для Command для StoredProcedure, если это произойдет. В противном случае он не обнаружит параметры.

Ответ 5

Другая причина, по которой возникает эта ошибка, - это когда имена переменных не совпадают в вашей хранимой процедуре и коде, потому что код не может найти параметр, которому должно передаваться значение. Убедитесь, что они соответствуют:

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

create procedure getEmployee
    @ID 
as
Begin
    select * 
    from emp 
    where id = @ID
End

код:

SqlParameter p = new SqlParameter("@ID", id);
cmd.Parameter.Add(p);

Параметр @ID должен совпадать как в коде, так и в хранимой процедуре