2013-02-01 5 views
11

я пытаюсь вставить данные в базу данных 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 

Пожалуйста, помогите мне. Заранее спасибо.

+2

Вы должны добавить параметры ... – sgeddes

+5

Это исключение происходит, когда вы не указываете тип команды, а также. Не применимо в вашем случае. – black

+0

Это было применимо в МОЕМ случае, так что большое спасибо от меня! :) –

ответ

11

Вы должны использовать 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 для получения дополнительной информации.

+0

Не использовать SQLCommand.Parameters.Add() его устаревший –

+0

Нет, AddWithValue заменяет добавление перегрузки, в которой значения строки и объекта были изменены из-за неоднозначности. Вы можете использовать Add для других целей. http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparametercollection.addwithvalue.aspx – Sumo

+0

http://stackoverflow.com/questions/9999751/difference-between-parameters-add-and- parameters-addwithvalue см. это также –

1

Вы должны использовать это:

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

В противном случае, он будет бросать это исключение для каждого из параметров.

+0

О! Я забыл написать это. Благодарю. Это решило мою проблему. – Pritam

+0

@Pritam, хорошо круто. –

+0

Да, я видел это исключение. Теперь он работает отлично. – Pritam

3

Входящая хранимая процедура ожидает @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)); 
+0

Спасибо. Я забыл добавить 'cmd.Parameters.AddWithValue ("@ Emp_no", Convert.ToInt32 (txtbx_Empno.Text));'. Теперь он работает нормально. – Pritam

0

«Есть только один метод добавления, который устарел, метод, который принимает строку для имени параметра и объекта для значения. Как вы отметили, вместо этого вы должны вызвать 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.

14

Просто хэдшоп, это может сэкономить много времени на поиск души. Если вы воспользовались рекомендацией здесь, например, с помощью AddWithValue, чтобы передать параметр, и вы все проверили, и все же вы все равно получаете сообщение об ошибке «Не поставляется», проверьте, установлено ли свойство CommandType объекта команды в CommandType.StoredProcedure.

Не устанавливая эту собственность, вы получаете то же сообщение, поверьте! Надеюсь, это поможет кому-то.

+2

Жаль, что я мог бы дать это +10. Не удалось увидеть что-то не так с кодом, и, в конце концов, большая царапина в голове, вот почему. Я действительно знал об этом, но просто забыл, что это напоминание - ОГРОМНАЯ экономия времени –

0

Для других: я столкнулся с той же ошибкой, потому что один из моих параметров был нулевым. Нам нужно проверить, что такие, как:

command.Parameters.AddWithValue("Features", (object)productDb.Features ?? DBNull.Value); 
Смежные вопросы

 Смежные вопросы