【问题标题】:Stored procedure or function expects parameter which was not supplied存储过程或函数需要未提供的参数
【发布时间】:2013-02-01 05:07:10
【问题描述】:

我正在尝试通过调用存储过程将数据插入到 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

请帮助我。提前致谢。

【问题讨论】:

  • 你需要添加参数...
  • 当您没有指定命令类型时会发生此异常。但不适用于您的情况。
  • 它适用于我的情况,非常感谢我! :)
  • 如果需要设置空值,不要简单写new SqlParamenter { ParamenterName = "@Foo" Value = null}。这样,您的应用程序会将参数作为默认值发送。插入null,必须提供... Value = DBNull.Value

标签: c# sql tsql ado.net


【解决方案1】:

只是提醒一下,它可能会为某人节省大量的灵魂搜索时间。如果您已遵循此处的建议,例如使用 AddWithValue 来传递参数,并且您已经验证了所有内容,但仍然收到错误消息“未提供”,请检查您是否设置了命令对象的 CommandType 属性到 CommandType.StoredProcedure。

不设置这个属性会产生同样的信息,相信我!希望它可以帮助某人。

【讨论】:

  • 希望我能给这个+10。看不出代码有什么问题,后来又挠头了,这就是原因。我确实知道这一点,但只是忘记了,所以这个提醒可以节省大量时间
  • 生活中的简单事物真正让我们快乐。 #storedprocedure
  • 太糟糕了,这个答案的作者已经超过 3 年没有登录 Stack Overflow 了......我准备当场给它一个 +100 的奖励。
  • 嗯,我很高兴它帮助了某人。抱歉,我的健康妨碍了我,所以直到我刚刚收到通知才回来查看。
  • 3 小时后,你是我的救星!!!,我有 CommandType.Text 而不是 StoredProdc
【解决方案2】:

你需要使用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 替换了由于歧义而采用字符串和对象参数的 Add 重载。您仍然可以将 Add 用于其他目的。 msdn.microsoft.com/en-us/library/…
  • 再一次,它是针对Addoverload 的,它将字符串和对象作为参数,就好像你为第二个参数传递一个 int 或一个枚举一样,它没有知道您是在指定类型还是值。它仍然是完全有效的。只有重载被弃用。 Add(Object)Add(SqlParameter)Add(String, SqlDbType, Int32)Add(String, SqlType, Int32, String) 仍然有效。
【解决方案3】:

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

command.Parameters.AddWithValue("@phone", (object)phone?? DBNull.Value);

【讨论】:

    【解决方案4】:

    您的 Insertion 存储过程需要 @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 ", Convert.ToInt32(txtbx_Empno.Text));'。现在它工作正常。
    【解决方案5】:

    你需要使用这个:

    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);
    

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

    【讨论】:

    • 哦!我忘记写这个了。谢谢。这解决了我的问题。
    • 这应该被标记为答案。用户在他的代码中声明了变量(与他的 SQL 参数的名称相匹配),但他从未使用过这些变量或其基础变量。
    【解决方案6】:

    这是可以做到的

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

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

    【讨论】:

      【解决方案7】:

      “只有一个 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。

      【讨论】:

        【解决方案8】:

        这些天仍然存在相同的错误消息,范围涉及多个问题 - 我的问题是将空值传递给参数。答案是像这样进行空检查:

        parameter.Value = (object)yourParamVal ?? DBNULL.Value;
        

        【讨论】:

          【解决方案9】:

          避免参数集为 DBNull.value 的没有值的参数

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-02-05
            • 2013-01-24
            • 1970-01-01
            相关资源
            最近更新 更多