Передать параметр ID в SQL из ASP.Net с использованием хранимой процедуры

#c# #sql #asp.net #.net #stored-procedures

#c# #sql #asp.net #.net #хранимые процедуры

Вопрос:

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

  System.Data.SqlClient.SqlException: Procedure or function 'updateEmployeeRecord' expects parameter '@Id', which was not supplied.
  

Трассировка стека;

 [SqlException (0x80131904): Procedure or function 'updateEmployeeRecord' expects parameter '@Id', which was not supplied.]
   EmployeeClass.Data.EmployeeList.EditEmpInfo(String connectionString, EmployeeList empInfo) in C:UsersnsamuelsDocumentsInduction ExercisesMasterPageTestExercise2EmployeeDataDataEmployeeClass.cs:120
   EmployeeData.About.btnAdd_Click(Object sender, EventArgs e) in C:UsersnsamuelsDocumentsInduction ExercisesMasterPageTestExercise2EmployeeDataAbout.aspx.cs:80
   System.Web.UI.WebControls.Button.OnClick(EventArgs e)  9774694
   System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument)  211
   System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument)  12
   System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument)  15
   System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)  35
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)  1696
  

Код в ASP .NET:

 public void EditEmpInfo(string connectionString, EmployeeList empInfo)
        {
            try
            {
                using (SqlConnection con = new SqlConnection(connectionString))
                {
                    con.Open();
                    string proc2 = "updateEmployeeRecord";
                    SqlCommand cmd = new SqlCommand(proc2, con);
                    cmd.CommandType = CommandType.StoredProcedure;
                    
                    cmd.Parameters.Add(new SqlParameter("@IDNUmber", empInfo.IDNumber));
                    cmd.Parameters.Add(new SqlParameter("@EmployeeNumber", empInfo.EmployeeNumber));
                    cmd.Parameters.Add(new SqlParameter("@EmployeeSurname", empInfo.employeeSurname));
                    cmd.Parameters.Add(new SqlParameter("@EmployeeName", empInfo.employeeName));
                    cmd.Parameters.Add(new SqlParameter("@NumOfDependants", empInfo.numberOfDependants));
                    cmd.Parameters.Add(new SqlParameter("@Employee_RaceId", empInfo.RaceId));
                    cmd.Parameters.Add(new SqlParameter("@Employee_GenderId", empInfo.GenderId));

                    cmd.ExecuteNonQuery();
                    con.Close();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
  

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

 SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[updateEmployeeRecord]
@Id int,
@EmployeeNumber varchar(50),
@IDNumber varchar(50),
@EmployeeSurname varchar(50),
@EmployeeName varchar(50),
@NumOfDependants int,
@Employee_RaceId int,
@Employee_GenderId int

AS
BEGIN

UPDATE dbo.Employees
SET
EmployeeNumber = @EmployeeNumber,
IDNumber = @IDNumber,
EmployeeSurname = @EmployeeSurname,
EmployeeName = @EmployeeName,
NumOfDependants = @NumOfDependants,
Employees_RaceId = @Employee_RaceId,
Employees_GenderId = @Employee_GenderId

WHERE Id =@Id
END
  

Если я добавлю строку ниже, ничего не произойдет, она просто вернется к Default.aspx.

 cmd.Parameters.Add(new SqlParameter("Id", empInfo.id));
  

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

РЕДАКТИРОВАТЬ: я разобрался с проблемой. Мне не нужно было ссылаться на значение ID.

Ответ №1:

У вас есть несоответствие в ваших параметрах в том, что все ваши остальные — «@parmName», но ваш идентификатор — это просто «Id» вместо «@Id». Не знаю, так это или нет. Однако я всегда ненавидел, когда имена параметров совпадали с точным именем столбца в таблице. Обычно имена моих параметров начинаются с «@p», чтобы указать его переменную ПАРАМЕТРА, а не только имя столбца. Предотвращает двусмысленность при чтении. Итак, это одно из предложений.

Кроме того, хранимая процедура может быть заблокирована, потому что вы не вызываете процедуру, идентифицирующую параметры, такие как

 string proc2 = "updateEmployeeRecord( @Id, @EmployeeNumber, @IDNumber, @restOfParms )"; 
  

ЗАТЕМ определите ваши параметры «@» в качестве параметров команды, чтобы они соответствовали заполнителям в updateEmployeeRecord из строки proc2.