Je peux effectuer une suppression, une insertion et une mise à jour dans mon programme et j'essaie de faire une insertion en appelant une procédure stockée créée à partir de ma base de données.
C'est un bouton que je fais bien fonctionner.
private void btnAdd_Click(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection(dc.Con);
SqlCommand cmd = new SqlCommand("Command String", con);
da.InsertCommand = new SqlCommand("INSERT INTO tblContacts VALUES (@FirstName, @LastName)", con);
da.InsertCommand.Parameters.Add("@FirstName", SqlDbType.VarChar).Value = txtFirstName.Text;
da.InsertCommand.Parameters.Add("@LastName", SqlDbType.VarChar).Value = txtLastName.Text;
con.Open();
da.InsertCommand.ExecuteNonQuery();
con.Close();
dt.Clear();
da.Fill(dt);
}
C'est le début du bouton permettant d'appeler la procédure nommée sp_Add_contact
pour ajouter un contact. Les deux paramètres pour sp_Add_contact(@FirstName,@LastName)
. J'ai cherché sur google un bon exemple mais je n'ai rien trouvé d'intéressant.
private void button1_Click(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection(dc.Con);
SqlCommand cmd = new SqlCommand("Command String", con);
cmd.CommandType = CommandType.StoredProcedure;
???
con.Open();
da. ???.ExecuteNonQuery();
con.Close();
dt.Clear();
da.Fill(dt);
}
C'est à peu près la même chose que de lancer une requête. Dans votre code d'origine, vous créez un objet de commande, vous le placez dans la variable cmd
et vous ne l'utilisez jamais. Ici, cependant, vous utiliserez cela à la place de da.InsertCommand
.
Utilisez également un using
pour tous les objets jetables, afin de vous assurer qu'ils sont correctement éliminés:
private void button1_Click(object sender, EventArgs e) {
using (SqlConnection con = new SqlConnection(dc.Con)) {
using (SqlCommand cmd = new SqlCommand("sp_Add_contact", con)) {
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@FirstName", SqlDbType.VarChar).Value = txtFirstName.Text;
cmd.Parameters.Add("@LastName", SqlDbType.VarChar).Value = txtLastName.Text;
con.Open();
cmd.ExecuteNonQuery();
}
}
}
Vous devez ajouter des paramètres car il est nécessaire que le SP s'exécute
using (SqlConnection con = new SqlConnection(dc.Con))
{
using (SqlCommand cmd = new SqlCommand("SP_ADD", con))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@FirstName", txtfirstname);
cmd.Parameters.AddWithValue("@LastName", txtlastname);
con.Open();
cmd.ExecuteNonQuery();
}
}
cmd.Parameters.Add(String parameterName, Object value)
est obsolète maintenant. Utilisez plutôt cmd.Parameters.AddWithValue(String parameterName, Object value)
Il n'y a pas de différence en termes de fonctionnalité. La raison pour laquelle ils ont déconseillé d'utiliser
cmd.Parameters.Add(String parameterName, Object value)
au profit deAddWithValue(String parameterName, Object value)
est plus claire. Voici la référence MSDN pour la même chose
private void button1_Click(object sender, EventArgs e) {
using (SqlConnection con = new SqlConnection(dc.Con)) {
using (SqlCommand cmd = new SqlCommand("sp_Add_contact", con)) {
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@FirstName", SqlDbType.VarChar).Value = txtFirstName.Text;
cmd.Parameters.AddWithValue("@LastName", SqlDbType.VarChar).Value = txtLastName.Text;
con.Open();
cmd.ExecuteNonQuery();
}
}
}
En guise d'alternative, j'ai une bibliothèque qui facilite le travail avec procs: https://www.nuget.org/packages/SprocMapper/
SqlServerAccess sqlAccess = new SqlServerAccess("your connection string");
sqlAccess.Procedure()
.AddSqlParameter("@FirstName", SqlDbType.VarChar, txtFirstName.Text)
.AddSqlParameter("@FirstName", SqlDbType.VarChar, txtLastName.Text)
.ExecuteNonQuery("StoreProcedureName");
public void myfunction(){
try
{
sqlcon.Open();
SqlCommand cmd = new SqlCommand("sp_laba", sqlcon);
cmd.CommandType = CommandType.StoredProcedure;
cmd.ExecuteNonQuery();
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
sqlcon.Close();
}
}