Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 存储过程或函数需要未提供的参数_C#_Sql_Tsql_Ado.net - Fatal编程技术网

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

C# 存储过程或函数需要未提供的参数,c#,sql,tsql,ado.net,C#,Sql,Tsql,Ado.net,我试图通过调用存储过程将数据插入SQL Server数据库,但遇到了错误 *过程或函数“插入”需要未提供的参数“@Emp_no”* 我的存储过程称为插入。我已经彻底检查过了,没有参数丢失,我也用标签检查过了。标签显示了值,但我不知道为什么会出现错误 我的代码是 try { SqlCommand cmd = new SqlCommand(); cmd.Parameters.Clear(); cmd.CommandType = Comm

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

*过程或函数“插入”需要未提供的参数“@Emp_no”*

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

我的代码是

    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
请帮帮我。提前感谢。

您需要使用以下功能:

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

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

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

请查看此网站以供参考:

无论在何处定义变量,都应使用
参数。AddWithValue

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

您需要使用
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
的模糊重载。有关详细信息,请参阅。

“只有一个Add方法已过时,即接受参数名称字符串和值对象的方法。如您所述,在这种情况下,您应该调用AddWithValue。”


并非所有参数。添加方法都已折旧。您打算如何生成输出参数?您必须使用Parameter.Add来实现此目的。

只需一个headup,它可能会节省一些人很多时间进行自我反省。如果您遵循了此处的建议,例如使用AddWithValue来传递参数,并且您已经验证了所有内容,但仍然收到错误消息“Not supplied”,请检查是否已将命令对象的CommandType属性设置为CommandType.StoredProcedure


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

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

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

这就是可以做到的

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

请注意,
AddWithValue
CommandType.StoredProcess
都是必需的。

这些天仍然有相同的错误消息,涉及多个问题-我的问题是将空值传递给参数。答案是空检查,如下所示:

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

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

您需要添加参数…如果不指定命令类型,则会发生此异常。但不适用于你的情况。它适用于我的情况,所以我非常感谢你!:)如果需要设置空值,请不要简单地编写
newsqlparametername{parametername=“@Foo”value=null}
。这样,您的应用程序将以defaultvalue的形式发送参数。如果为空,则必须提供
。。。Value=DBNull.Value
Oh!我忘了写这个了。谢谢这解决了我的问题。这应该被标记为答案。用户在代码中声明变量(与SQL参数的名称匹配),但他从未使用这些变量或其基础变量。谢谢。我忘记添加“cmd.Parameters.AddWithValue”(@Emp_no),Convert.ToInt32(txtbx_Empno.Text));”。现在它工作正常。不,AddWithValue替换了由于歧义而占用字符串和对象参数的Add重载。您仍然可以将Add用于其他目的。参见此内容,这是针对
Add
的重载,该重载将字符串和对象作为参数,就像您为第二个参数传递int或enum一样,它不知道您是在指定类型还是值。它仍然完全可以使用。只有重载是不推荐的
Add(Object)
Add(SqlParameter)
Add(String,SqlDbType,Int32)
Add(String,SqlType,Int32,String)
仍然有效。希望我能给这个+10。看不出代码有什么问题,这就是为什么,后来有很多人对此感到头疼。我确实知道这一点,但只是忘记了,所以这个提醒是一个巨大的时间节省,而不是简单的事情,在生活中,真正让我们快乐#storedprocedureToo bad此答案的作者已经三年多没有登录到堆栈溢出。。。。我准备当场给它一个+100的奖金。好吧,我很高兴它帮助了别人。对不起,我的健康妨碍了我,所以直到我得到通知才回来。3个小时后,你是我的救星!!!,我使用CommandType.Text而不是StoredProdc