Сохраненная процедура или функция ожидает параметра, который не был поставлен
Я пытаюсь вставить данные в базу данных 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
Пожалуйста, помогите мне. Спасибо заранее.
Ответы
Ответ 1
Вам нужно использовать 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
, которая взяла параметр string и object. Подробнее см. MSDN.
Ответ 2
Просто хэдшоп, это может сэкономить кому-то много времени на поиск души. Если вы воспользовались рекомендацией здесь, например, с помощью AddWithValue, чтобы передать параметр, и вы все проверили, и все же вы все равно получаете сообщение об ошибке "Не поставляется", проверьте, установлено ли свойство CommandType объекта команды к CommandType.StoredProcedure.
Не устанавливая это свойство, вы берете одно и то же сообщение, поверьте! Надеюсь, это поможет кому-то.
Ответ 3
Ваша хранимая процедура 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));
Ответ 4
Вам нужно использовать это:
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);
В противном случае он выкинет это исключение для каждого из параметров.
Ответ 5
Для других: я просто столкнулся с той же ошибкой, потому что один из моих параметров был нулевым. Нам нужно проверить его, например:
command.Parameters.AddWithValue("Features", (object)productDb.Features ?? DBNull.Value);
Ответ 6
"Там только один метод добавления, который был устаревшим, метод, который принимает строку для имени параметра и объекта для значения. Как вы отметили, вместо этого вы должны вызвать 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 для этого.
Ответ 7
Вот как это можно сделать
using (var cmd = new SqlCommand("STORED_PROCEDURE_NAME", SqlConnection))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@PARAM_NAME", PARAM_VALUE);
}
Обратите внимание, что AddWithValue
и CommandType.StoredProcedure
необходимы.
Ответ 8
То же самое сообщение об ошибке все еще в эти дни, определяющее множество проблем - моя проблема передавала нулевое значение параметру. Ответ на
parameter.Value = (object)yourParamVal ?? DBNULL.Value;