C# 存储过程或函数需要未提供的参数
我试图通过调用存储过程将数据插入SQL Server数据库,但遇到了错误 *过程或函数“插入”需要未提供的参数“@Emp_no”* 我的存储过程称为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
插入
。我已经彻底检查过了,没有参数丢失,我也用标签检查过了。标签显示了值,但我不知道为什么会出现错误
我的代码是
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