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

Pri*_*tam 16 c# sql t-sql ado.net

我试图通过调用存储过程将数据插入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();
    }
Run Code Online (Sandbox Code Playgroud)

并且存储过程是

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
Run Code Online (Sandbox Code Playgroud)

请帮我.提前致谢.

Mun*_*iro 41

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

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

  • 希望我能给这个+10.无法看到代码有什么问题,而且稍后会有很多问题,这就是原因.我确实知道这一点,但只是忘了所以这个提醒是一个巨大的节省时间 (8认同)
  • 生活中那些简单的事情,才是真正让我们快乐的事情。#存储过程 (2认同)

Sum*_*umo 13

你需要使用SqlCommand.Parameters.AddWithValue:

cmd.Parameters.AddWithValue("@ParameterName", value);
Run Code Online (Sandbox Code Playgroud)

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

cmd.Parameters.Add("@ParameterName", SqlDbType.Int, 5);
cmd.Parameters["@ParameterName"].Value = value;
Run Code Online (Sandbox Code Playgroud)

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


Mal*_*ick 7

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

command.Parameters.AddWithValue("@phone", (object)phone?? DBNull.Value);
Run Code Online (Sandbox Code Playgroud)