[英]Stored procedure or function expects parameter which was not supplied
我正在尝试通过调用存储过程将数据插入 SQL Server 数据库,但出现错误
*过程或函数“插入”需要未提供的参数“@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
请帮我。 提前致谢。
只是一个提示,它可能会为某人节省很多时间进行自我反省。 如果您遵循了此处的建议,例如使用 AddWithValue 来传递参数,并且您已验证所有内容,但仍然收到错误消息“未提供”,请检查您是否已设置命令对象的 CommandType 属性到 CommandType.StoredProcedure。
不设置此属性会导致相同的消息,相信我! 希望它可以帮助某人。
您需要使用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 。
对于其他人:我刚刚遇到了同样的错误,因为我的一个参数为空。 我们需要检查它,例如:
command.Parameters.AddWithValue("@phone", (object)phone?? DBNull.Value);
您的插入存储过程需要@Emp_no
(以及大约 15 个其他参数)。 您不能在不传递参数的情况下调用存储过程。
看看这个网站以供参考:
在您定义变量的任何地方,请改用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);
否则,它将为每个参数抛出该异常。
这是如何做到的
using (var cmd = new SqlCommand("STORED_PROCEDURE_NAME", SqlConnection))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@PARAM_NAME", PARAM_VALUE);
}
请注意AddWithValue
和CommandType.StoredProcedure
都是必不可少的。
“只有一个 Add 方法已过时,该方法接受参数名称的字符串和值的对象。正如您所指出的,对于这种情况,您应该调用 AddWithValue。”
并非所有 Parameter.Add 方法都已折旧。 你想如何制作一个 OUTPUT 参数? 为此,您必须使用 Parameter.Add。
这些天仍然存在相同的错误消息,涵盖多个问题 - 我的问题是将空值传递给参数。 答案是空检查,如下所示:
parameter.Value = (object)yourParamVal ?? DBNULL.Value;
避免参数集为 DBNull.value 的没有值的参数
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.