【问题标题】:Pass ID parameter to SQL from ASP .Net using stored procedure使用存储过程将 ID 参数从 ASP .Net 传递给 SQL
【发布时间】:2021-02-17 01:44:58
【问题描述】:

我试图通过传递参数在 SQL 中调用一个 UPDATE 存储过程,它需要更新一个特定的 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:\Users\nsamuels\Documents\Induction Exercises\MasterPageTest\Exercise2\EmployeeData\Data\EmployeeClass.cs:120
   EmployeeData.About.btnAdd_Click(Object sender, EventArgs e) in C:\Users\nsamuels\Documents\Induction Exercises\MasterPageTest\Exercise2\EmployeeData\About.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 的数据库记录,即使它只有一个值。

编辑:我发现了这个问题。我不需要引用 ID 值。

【问题讨论】:

    标签: c# sql asp.net .net stored-procedures


    【解决方案1】:

    您的参数不一致,因为您的所有其他参数都是“@parmName”,但您的 ID 只是“Id”而不是“@Id”。不知道是不是这样。但是,我一直讨厌让参数名称与表中的确切列名称匹配。我通常会让我的参数名称以“@p”开头,以表示它是一个 PARAMETER 变量,而不仅仅是列的名称。防止阅读时产生歧义。所以,这是一个建议。

    此外,存储过程可能会阻塞,因为您没有调用标识参数的过程,例如

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

    然后将您的“@”参数定义为命令参数,以匹配来自 proc2 字符串的 updateEmployeeRecord 中的占位符。

    【讨论】:

      猜你喜欢
      • 2015-01-02
      • 2015-09-21
      • 2013-10-24
      • 2016-04-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多