存储过程或函数需要未提供的参数

我试图通过调用存储过程将数据插入SQL Server数据库,但我收到错误

*过程或函数’Insertion’需要参数’@Emp_no’,但未提供*

我的存储过程称为Insertion 。 我已经彻底检查了它,没有参数丢失,我也用标签检查了它。 标签显示值,但我不知道为什么我收到错误。

我的代码是

  try { SqlCommand cmd = new SqlCommand(); cmd.Parameters.Clear(); cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = "Insertion"; cmd.Connection = con; if (rdb_Male.Checked) { int @Emp_no = Convert.ToInt32(txtbx_Empno.Text); string @Emp_name = txtbx_Emp_Name.Text; double @phone = Convert.ToDouble(txtbx_Phone.Text); string @Email = txtbx_Email.Text; string @Password = txtbx_Pwd.Text; string @Gender = rdb_Male.Text; DateTime @Dob = Convert.ToDateTime(dob); string @Address = txtbx_Address.Text; string @Designation = txtbx_Designation.Text; string @Qualification = txtbx_Qual.Text; double @Experience = Convert.ToDouble(txtbx_Exp.Text); double @Salary = Convert.ToDouble(txtbx_Sal.Text); DateTime @Doj = Convert.ToDateTime(doj); } else if (rdb_Female.Checked) { int @Emp_no = Convert.ToInt32(txtbx_Empno.Text); string @Emp_name = txtbx_Emp_Name.Text; double @phone = Convert.ToDouble(txtbx_Phone.Text); string @Email = txtbx_Email.Text; string @Password = txtbx_Pwd.Text; string @Gender = rdb_Female.Text; DateTime @Dob = Convert.ToDateTime(dob); string @Address = txtbx_Address.Text; string @Designation = txtbx_Designation.Text; string @Qualification = txtbx_Qual.Text; double @Experience = Convert.ToDouble(txtbx_Exp.Text); double @Salary = Convert.ToDouble(txtbx_Sal.Text); DateTime @Doj = Convert.ToDateTime(doj); } if (con.State==ConnectionState.Closed) con.Open(); LABEL.Text = txtbx_Empno.Text; cmd.ExecuteNonQuery(); lbl_Errormsg.Visible = true; lbl_Errormsg.Text = "Record Inserted Successfully"; con.Close(); } 

并且存储过程是

 ALTER PROCEDURE dbo.Insertion ( @Emp_no int, @Emp_name varchar(30), @phone numeric(10,0), @Email varchar(30), @Password varchar(10), @Gender varchar(6), @Dob date, @Address varchar(100), @Designation varchar(20), @Qualification varchar(20), @Experience numeric(4,2), @Salary numeric(10,2), @Doj date ) AS Begin Insert into Register (Emp_no, Emp_name, phone, Email, Password, Gender, Dob, Address, Designation, Qualification, Experience, Salary, Doj) Values(@Emp_no, @Emp_name, @phone, @Email, @Password, @Gender, @Dob, @Address, @Designation, @Qualification, @Experience, @Salary, @Doj) End 

请帮我。 提前致谢。

您需要使用SqlCommand.Parameters.AddWithValue

 cmd.Parameters.AddWithValue("@ParameterName", value); 

SqlCommand.Parameters.Add用于其他数据类型:

 cmd.Parameters.Add("@ParameterName", SqlDbType.Int, 5); cmd.Parameters["@ParameterName"].Value = value; 

SqlCommand.Parameters.AddWithValue替换了带有字符串和对象参数的Add的模糊重载。 有关详细信息,请参阅MSDN 。

只是一个单挑,它可能会节省很多时间灵魂搜索。 如果您已按照此处的建议操作,例如使用AddWithValue以传递参数,并且您已validation所有内容但仍然收到错误消息“未提供”,请检查是否已设置命令对象的CommandType属性到CommandType.StoredProcedure。

不设置此属性会产生相同的消息,请相信我! 希望它可以帮到某人。

您的插入存储过程需要@Emp_no (以及大约15个其他参数)。 如果不传递参数,则无法调用存储过程。

看看这个网站以供参考:

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparametercollection.addwithvalue.aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-2

无论你在哪里定义变量,都要使用Parameters.AddWithValue

 cmd.Parameters.AddWithValue("@Emp_no ", Convert.ToInt32(txtbx_Empno.Text)); 

你需要使用这个:

 cmd.Parameters.AddWithValue("@Emp_no", @Emp_no); cmd.Parameters.AddWithValue("@Emp_name", @Emp_name); cmd.Parameters.AddWithValue("@phone", @phone); cmd.Parameters.AddWithValue("@Email", @Email); cmd.Parameters.AddWithValue("@Password", @Password); cmd.Parameters.AddWithValue("@Gender", @Gender); cmd.Parameters.AddWithValue("@Dob", @Dob); cmd.Parameters.AddWithValue("@Address", @Address); cmd.Parameters.AddWithValue("@Designation", @Designation); cmd.Parameters.AddWithValue("@Experience", @Experience); cmd.Parameters.AddWithValue("@Salary", @Salary); cmd.Parameters.AddWithValue("@Doj", @Doj); 

否则,它将为每个参数抛出该exception。

对于其他人:我只是遇到了同样的错误,因为我的一个参数是null。 我们需要检查它,例如:

 command.Parameters.AddWithValue("Features", (object)productDb.Features ?? DBNull.Value); 

“只有一个已经过时的Add方法,接受参数名称字符串的方法和值的对象。正如您所指出的,您应该为此方案调用AddWithValue。”

http://social.msdn.microsoft.com/Forums/en-US/15bb16a4-0cf1-4289-b677-3b9d98f09298/parametersaddwithvalue-output-parameter-in-adonet-2?forum=adodotnetdataproviders

并非所有Parameter.Add方法都已折旧。 您如何设置OUTPUT参数? 你必须使用Parameter.Add。

这是如何做到的

 using (var cmd = new SqlCommand("STORED_PROCEDURE_NAME", SqlConnection)) { cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.AddWithValue("@PARAM_NAME", PARAM_VALUE); } 

请注意, AddWithValueCommandType.StoredProcedure都是必不可少的。