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.

1voto

Sudhakar Rao Points 179

Les fournisseurs de données .NET se composent d'un certain nombre de classes utilisées pour se connecter à une source de données, exécuter des commandes et renvoyer des jeux d'enregistrements. L'objet de commande dans ADO.NET fournit un certain nombre de méthodes d'exécution qui peuvent être utilisées pour exécuter les requêtes SQL de différentes manières.

Une procédure stockée est un objet exécutable précompilé qui contient une ou plusieurs instructions SQL. Dans de nombreux cas, les procédures stockées acceptent des paramètres d'entrée et renvoient plusieurs valeurs . Les valeurs des paramètres peuvent être fournies si une procédure stockée est écrite pour les accepter. Un exemple de procédure stockée acceptant des paramètres d'entrée est donné ci-dessous :

  CREATE PROCEDURE SPCOUNTRY
  @COUNTRY VARCHAR(20)
  AS
  SELECT PUB_NAME FROM publishers WHERE COUNTRY = @COUNTRY
  GO

La procédure stockée ci-dessus accepte un nom de pays (@COUNTRY VARCHAR(20)) comme paramètre et renvoie tous les éditeurs du pays saisi. Une fois que le CommandType est défini sur StoredProcedure, vous pouvez utiliser la collection Parameters pour définir les paramètres.

  command.CommandType = CommandType.StoredProcedure;
  param = new SqlParameter("@COUNTRY", "Germany");
  param.Direction = ParameterDirection.Input;
  param.DbType = DbType.String;
  command.Parameters.Add(param);

Le code ci-dessus passe le paramètre pays à la procédure stockée depuis l'application C#.

using System;
using System.Data;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string connetionString = null;
            SqlConnection connection ;
            SqlDataAdapter adapter ;
            SqlCommand command = new SqlCommand();
            SqlParameter param ;
            DataSet ds = new DataSet();

            int i = 0;

            connetionString = "Data Source=servername;Initial Catalog=PUBS;User ID=sa;Password=yourpassword";
            connection = new SqlConnection(connetionString);

            connection.Open();
            command.Connection = connection;
            command.CommandType = CommandType.StoredProcedure;
            command.CommandText = "SPCOUNTRY";

            param = new SqlParameter("@COUNTRY", "Germany");
            param.Direction = ParameterDirection.Input;
            param.DbType = DbType.String;
            command.Parameters.Add(param);

            adapter = new SqlDataAdapter(command);
            adapter.Fill(ds);

            for (i = 0; i <= ds.Tables[0].Rows.Count - 1; i++)
            {
                MessageBox.Show (ds.Tables[0].Rows[i][0].ToString ());
            }

            connection.Close();
        }
    }
}

1 votes

Votre réponse n'utilise pas en utilisant ce qui est une bonne pratique. Il faut également prévoir un bloc try catch pour traiter les éventuelles exceptions.

1voto

Matstar Points 169

Voici ma technique que j'aimerais partager. Elle fonctionne bien tant que les types de propriétés clr sont des types équivalents sql, par exemple bool -> bit, long -> bigint, string -> nchar/char/varchar/nvarchar, decimal -> money.

public void SaveTransaction(Transaction transaction) 
{
    using (var con = new SqlConnection(ConfigurationManager.ConnectionStrings["ConString"].ConnectionString))
    {
        using (var cmd = new SqlCommand("spAddTransaction", con))
        {
            cmd.CommandType = CommandType.StoredProcedure;
            foreach (var prop in transaction.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance))
                cmd.Parameters.AddWithValue("@" + prop.Name, prop.GetValue(transaction, null));
            con.Open();
            cmd.ExecuteNonQuery();
        }
    }
}

0voto

balmerhevi Points 1

Les valeurs des paramètres peuvent être fournies si une procédure stockée est écrite pour les accepter.

    param = new SqlParameter("@COUNTRY", "Germany");
    param.Direction = ParameterDirection.Input;
    param.DbType = DbType.String;
    command.Parameters.Add(param);

Full Source.. Procédure stockée avec paramètre

Balmer

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