2013-02-01 4 views
11

Sto cercando di inserire dati in un database SQL Server chiamando una stored procedure, ma sto ottenendo l'erroreprocedure o stored function aspetta parametro che non è stata fornita

* Procedura o funzione si aspetta 'inserimento' parametro '@Emp_no', che non è stato fornito *

La mia stored procedure è denominata Insertion. Ho controllato a fondo e nessun parametro manca anche io l'ho controllato usando un'etichetta. L'etichetta mostra il valore ma non so perché sto ottenendo l'errore.

mio codice è

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

e la stored procedure è

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 

Ti prego, aiutami. Grazie in anticipo.

+2

È necessario aggiungere parametri ... – sgeddes

+5

Questa eccezione si verifica quando non si specifica anche il tipo di comando. Non applicabile nel tuo caso però. – black

+0

Era applicabile nel mio caso, quindi un grande Grazie da parte mia! :) –

risposta

11

È necessario utilizzare SqlCommand.Parameters.AddWithValue:

cmd.Parameters.AddWithValue("@ParameterName", value); 

o SqlCommand.Parameters.Add per altri tipi di dati:

cmd.Parameters.Add("@ParameterName", SqlDbType.Int, 5); 
cmd.Parameters["@ParameterName"].Value = value; 

SqlCommand.Parameters.AddWithValue sostituisce l'overload ambiguo di Add che ha preso un parametro di stringa e oggetto. Vedi MSDN per maggiori informazioni.

+0

Non utilizzare SQLCommand.Parameters.Add() il suo deprecato –

+0

No, AddWithValue sostituisce l'overload aggiuntivo che ha richiesto parametri stringa e oggetto a causa di ambiguità. Puoi ancora usare Aggiungi per altri scopi. 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- parametri-addwithvalue vedi anche –

1

è necessario utilizzare questo:

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

In caso contrario, si getterà che un'eccezione per ciascuno dei parametri.

+0

Oh! Ho dimenticato di scrivere questo. Grazie. Questo ha risolto il mio problema. – Pritam

+0

@Pritam, ok, bello. –

+0

Sì, ho visto questa eccezione. Ora funziona bene. – Pritam

3

La procedura di inserimento memorizzato è prevista per @Emp_no (insieme a circa 15 altri parametri). Non è possibile chiamare la stored procedure senza passare i parametri.

Date un'occhiata a questo sito per riferimento:

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparametercollection.addwithvalue.aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-2

Ovunque si sta definendo variabili, utilizzare Parameters.AddWithValue invece:

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

Grazie. Ho dimenticato di aggiungere 'cmd.Parameters.AddWithValue ("@ Emp_no", Convert.ToInt32 (txtbx_Empno.Text));'. Ora sta funzionando bene. – Pritam

0

"C'è solo un metodo Add che è obsoleto, il metodo che accetta una stringa per il nome del parametro e un oggetto per il valore. Come hai notato, dovresti chiamare AddWithValue invece per questo scenario."

http://social.msdn.microsoft.com/Forums/en-US/15bb16a4-0cf1-4289-b677-3b9d98f09298/parametersaddwithvalue-output-parameter-in-adonet-2?forum=adodotnetdataproviders

Non tutti i metodi Parameter.Add sono ammortizzati. Come pensi di creare un parametro OUTPUT? Devi usare Parameter.Add per questo.

14

Solo un colpo di testa, potrebbe salvare qualcuno un sacco di tempo per la ricerca dell'anima. Se hai seguito la raccomandazione qui, ad esempio usando AddWithValue per passare un parametro, e hai tutto verificato e tuttavia ricevi ancora il messaggio di errore "Non fornito", controlla se hai impostato la proprietà CommandType dell'oggetto comando a CommandType.StoredProcedure.

Non impostare questa proprietà incorre nello stesso messaggio, credetemi! Spero che aiuti qualcuno.

+2

Vorrei poter dare questo +10. Non è stato possibile vedere nulla di sbagliato nel codice e, dopo aver grattato la testa in seguito, questo è il motivo. Ho fatto un po 'di sapere questo, ma ho appena dimenticato quindi questo promemoria è un enorme risparmio di tempo –

0

Per gli altri: ho appena affrontato lo stesso errore perché uno dei miei parametri era nullo. Dobbiamo verificarlo come:

command.Parameters.AddWithValue("Features", (object)productDb.Features ?? DBNull.Value);