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.
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.
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.
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:
Partout où vous définissez des variables, utilisez plutôt Parameters.AddWithValue
:
cmd.Parameters.AddWithValue("@Emp_no ", Convert.ToInt32(txtbx_Empno.Text));
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);
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.
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.
"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."
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.