执行存储过程时必须声明标量变量Error

时间:2019-04-07 02:27:04

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

我想使用存储过程在表中插入新记录:

string cs = ConfigurationManager.ConnectionStrings["dbconnection"].ConnectionString;

using (SqlConnection con = new SqlConnection(cs))
{
    string name = txtEmployeeName.Text;
    string gender = ddlGender.SelectedValue;
    int salary = Convert.ToInt32(txtSalary.Text);

    SqlParameter op = new SqlParameter();
    op.ParameterName = "@EmployeeId";
    op.SqlDbType = System.Data.SqlDbType.Int;
    op.Direction = System.Data.ParameterDirection.Output;

    string str = string.Format( "exec spAddEmployee '{0}', '{1}', '{2}', {3}", name,gender,salary,op);

    SqlCommand cmd = new SqlCommand(str,con);
    con.Open();
    cmd.ExecuteNonQuery();

    string EmpId = op.Value.ToString();

    lblMessage.Text = "Employee ID = " + EmpId;  
}

我没有使用cmd.Parameters.AddWithValue(),而是如上所述传递参数。但是我遇到一个错误:

  

必须声明标量变量“ @EmployeeId”。

这是我的存储过程:

CREATE PROCEDURE spAddEmployee  
    @Name NVARCHAR(50),  
    @Gender NVARCHAR(20),  
    @Salary INT, 
    @EmployeeId INT OUT
AS 
BEGIN
    INSERT INTO tblEmployees 
    VALUES (@Name, @Gender, @Salary)  

    SELECT @EmployeeId = SCOPE_IDENTITY()  
END

1 个答案:

答案 0 :(得分:0)

您没有将任何参数附加到SqlCommand。您基本上运行的是一个看起来像这样的字符串-“ exec spAddEmployee'nameValue','genderValue','salaryValue',@EmployeeId”。您的SqlCommand从未被告知@EmployeeId是和Int Output Parameter。

而且,更重要的是,您的程序有极高的SQL注入风险。如果用户在txtName中填充“ ;; DROP TABLE tblEmployees;-” 你可能会很不高兴找到自己的tblEmployees表中删除。

因此,如果您想以正确且安全的方式进行此操作。您应该执行以下操作:

u

如果出于某种原因您坚持要打开程序以进行SQL注入,则至少需要在cmd字符串中添加“ DECLARE @EmployeeId INT”。