web-dev-qa-db-fra.com

Procédure ou fonction stockée attend un paramètre qui n'a pas été fourni

J'essaie d'insérer des données dans une base de données SQL Server en appelant une procédure stockée, mais le message d'erreur s'affiche. 

* La procédure ou la fonction 'Insertion' attend le paramètre '@Emp_no', qui n'a pas été fourni *

Ma procédure stockée s'appelle Insertion. Je l'ai vérifiée à fond et il ne manque aucun paramètre. Je l'ai également vérifiée à l'aide d'une étiquette. L'étiquette indique la valeur, mais je ne sais pas pourquoi je reçois l'erreur. 

Mon code est 

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

et la procédure stockée est 

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

Aidez-moi, s'il vous plaît. Merci d'avance.

14
Pritam

Vous devez utiliser SqlCommand.Parameters.AddWithValue:

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

ou SqlCommand.Parameters.Add pour d'autres types de données:

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

SqlCommand.Parameters.AddWithValue remplace la surcharge ambiguë de Add ayant pris une chaîne et un paramètre d'objet. Voir MSDN pour plus d’informations.

11
Sumo

Juste un heads-up, cela pourrait faire économiser beaucoup de temps à quelqu'un qui cherche l'âme. Si vous avez suivi la recommandation ici, par exemple si vous utilisez AddWithValue pour transmettre un paramètre, que tout est vérifié et que le message d'erreur "Non fourni" persiste, vérifiez si vous avez défini la propriété CommandType de l'objet de commande à CommandType.StoredProcedure.

Ne pas définir cette propriété entraîne le même message, croyez-moi! J'espère que ça aide quelqu'un.

31
MunirS

Votre procédure stockée d'insertion attend @Emp_no (avec environ 15 autres paramètres). Vous ne pouvez pas appeler la procédure stockée sans passer les paramètres.

Jetez un coup d'oeil à ce site pour référence:

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

Partout où vous définissez des variables, utilisez plutôt Parameters.AddWithValue:

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

Pour d'autres: je viens de faire face à la même erreur car l'un de mes paramètres était null. Nous devons vérifier par exemple:

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

Vous devez utiliser ceci: 

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

Sinon, cette exception sera levée pour chacun des paramètres. 

2
Aniket Inge

Voici comment cela peut être fait

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

Notez que AddWithValue et CommandType.StoredProcedure sont essentiels.

0
Sameer

"Une seule méthode Add est obsolète, celle qui accepte une chaîne pour le nom du paramètre et un objet pour la valeur. Comme vous l'avez indiqué, vous devez appeler AddWithValue à la place pour ce scénario."

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

Toutes les méthodes Parameter.Add ne sont pas amorties. Comment faites-vous pour créer un paramètre OUTPUT? Vous devez utiliser Parameter.Add pour cela.

0
user3313809