我想使用存储过程在表中插入新记录:
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
答案 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”。