170 votes

Appeler une procédure stockée avec paramètre en c#

Je suis capable de supprimer, d'insérer et de mettre à jour dans mon programme et j'essaie d'effectuer une insertion en appelant une procédure stockée créée à partir de ma base de données.

Ce bouton que j'ai fabriqué fonctionne bien.

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 qui appelle 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 quelques bons exemples 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);
    }

15 votes

Le préfixe sp_ est une convention de dénomination des procédures stockées du système qui, lorsque SQL le voit, recherche d'abord dans toutes les procédures stockées du système avant toute application ou procédure stockée de l'espace utilisateur. En ce qui concerne les performances, si vous y tenez dans votre application, le préfixe sp_ dégradera vos temps de réponse.

303voto

Guffa Points 308133

C'est à peu près la même chose que d'exécuter une requête. Dans votre code d'origine, vous créez un objet de commande, vous le placez dans le champ cmd et ne l'utilisez jamais. Ici, cependant, vous l'utiliserez au lieu de da.InsertCommand .

Utilisez également un using pour tous les objets jetables, afin d'être sûr qu'ils sont éliminés correctement :

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

9 votes

Mais si cette procédure renvoie des données, comment puis-je les attraper en C# ?

10 votes

@M009 : Alors vous utilisez ExecuteReader o ExecuteScalar pour l'appeler.

0 votes

En fait, j'ai trouvé la solution, il faut d'abord utiliser le "cmd" pour déclarer et initialiser un SqlDataAdapter comme : [SqlDataAdapter da = new SqlDataAdapter(cmd) ;], puis [da.SelectCommand = cmd ;], et enfin [da.Fill(ds) ;] où "ds" est un dataset que vous avez préalablement déclaré . Ensuite, vous pouvez utiliser ce jeu de données pour lire des données comme vous le souhaitez :)

44voto

Ravi Gadag Points 9809

Vous devez ajouter des paramètres car ils sont nécessaires à l'exécution du SP.

using (SqlConnection con = new SqlConnection(dc.Con))
{
    using (SqlCommand cmd = new SqlCommand("SP_ADD", con))
    {
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@FirstName", txtfirstname.Text);
        cmd.Parameters.AddWithValue("@LastName", txtlastname.Text);
        con.Open();
        cmd.ExecuteNonQuery();
    }            
}

10 votes

AddWithValue est une mauvaise idée ; le serveur SQL n'utilise pas toujours la longueur correcte pour nvarchar ou varchar, ce qui entraîne une conversion implicite. Il est préférable de spécifier explicitement la longueur du paramètre, puis d'ajouter la valeur séparément à l'aide de la commande parameter.Value = txtfirstname .

18voto

Rahul Nikate Points 2792

cmd.Parameters.Add(String parameterName, Object value) est maintenant déprécié. Utilisez plutôt cmd.Parameters.AddWithValue(String parameterName, Object value)

Add(String parameterName, Object value) a été déprécié. Utiliser AddWithValue(String parameterName, Object value)

Il n'y a aucune différence en termes de fonctionnalité. La raison pour laquelle ils déprécié le cmd.Parameters.Add(String parameterName, Object value) en faveur de AddWithValue(String parameterName, Object value) est de donner plus de clarté. 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();
    }
  }
}

2 votes

Avez-vous un lien ou une source pour l'affirmation selon laquelle cmd.Parameters.Add est déprécié ?

1 votes

0 votes

Le commentaire sur le fait que Add est déprécié est valide, et invalide la réponse acceptée. Citation : "AddWithValue remplace la méthode Add ... qui prend une chaîne de caractères et un objet a été dépréciée en raison d'une possible ambiguïté avec la surcharge SqlParameterCollection.Add.... Utilisez AddWithValue chaque fois que vous voulez ajouter un paramètre en spécifiant son nom et sa valeur." msdn.microsoft.com/fr/us/library/ Correction de la syntaxe de l'exemple de @RahulNikate.

3voto

Greg R Taylor Points 891

Comme alternative, j'ai une bibliothèque qui permet de travailler facilement avec les 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("StoredProcedureName");

2voto

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

0 votes

Le paramètre est manquant, mais, selon moi, la meilleure réponse est d'inclure command.parameters.AddSqlParameter("@FirstName", SqlDbType.VarChar).Value ="myText" y if (connection.State != ConnectionState.Closed) connection.Close(); .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X