Procédure stockée Return

Cette section montre comment appeler une procédure stockée avec ADO.NET : utiliser ExecuteNonQuery pour récupérer le nombre de lignes affectées et en même temps récupérer la valeur renvoyée par Return de la procédure stockée.

1. Définition de la procédure stockée base de données

create procedure mynewproc(@id int)
as
begin
    declare @cout int
    -- Requête de mise à jour
    update Article set title = '111' where id = @id
    -- Compter les enregistrements dont l'id est supérieur au paramètre d'entrée
    select @cout = count(1) from Article where id > @id
    -- return renvoie une valeur numérique (pour SQL Server, return ne fonctionne qu'avec le type int)
    return @cout
endLangage du code : PHP (php)

Point clé : return @cout est la valeur de retour de la procédure stockée, à ne pas confondre avec le paramètre de sortie output.

2. Appel depuis C#

string connectionString = "Data Source=.;Initial Catalog=db;Integrated Security=SSPI;";
using (SqlConnection connection = new SqlConnection(connectionString))
{
    connection.Open();
    SqlCommand command = new SqlCommand("mynewproc", connection);
    command.CommandType = CommandType.StoredProcedure;

    // 【Essentiel】Enregistrer le paramètre de retour Return, nom fixé à ReturnValue
    SqlParameter para = new SqlParameter(
        "ReturnValue",
        SqlDbType.Int,
        4,
        ParameterDirection.ReturnValue,
        false,0,0,string.Empty,DataRowVersion.Default,null);
    command.Parameters.Add(para);

    // Paramètre d’entrée de la procédure stockée @id
    SqlParameter param = new SqlParameter("@id", SqlDbType.Int, 8);
    param.Value = 4;
    param.Direction = ParameterDirection.Input;
    command.Parameters.Add(param);

    // ExecuteNonQuery : exécute insert/update/delete, renvoie 【nombre de lignes affectées par update】
    int rowsAffected = command.ExecuteNonQuery();
    // Récupérer la valeur transmise par le return de la procédure stockée
    int result = (int)command.Parameters["ReturnValue"].Value;
}Langage du code : PHP (php)

Écriture recommandée

string connectionString = "Data Source=.;Initial Catalog=db;Integrated Security=SSPI;";
using (SqlConnection conn = new SqlConnection(connectionString))
using (SqlCommand cmd = new SqlCommand("mynewproc", conn))
{
    conn.Open();
    cmd.CommandType = CommandType.StoredProcedure;

    // Enregistrer paramètre retour (nom fixe : ReturnValue, direction obligatoire ReturnValue)
    cmd.Parameters.Add("ReturnValue", SqlDbType.Int).Direction = ParameterDirection.ReturnValue;
    // Paramètre d'entrée
    cmd.Parameters.Add("@id", SqlDbType.Int).Value = 4;

    // rowsAffected = nombre d’enregistrements modifiés par l’instruction update
    int rowsAffected = cmd.ExecuteNonQuery();
    // Lire la valeur return @cout de la procédure stockée
    int procReturnVal = (int)cmd.Parameters["ReturnValue"].Value;
}Langage du code : JavaScript (javascript)

Remarques

1. int rowsAffected = command.ExecuteNonQuery();
  • Signification : nombre de lignes touchées par les instructions DML (update/delete/insert)
  • Dans cet exemple : nombre d’enregistrements correspondants et modifiés par update Article set title='111' where id=@id
  • Ce n’est pas la valeur renvoyée par le return de la procédure stockée ! Les deux sont totalement indépendants
2. Paramètre de retour ReturnValue
  1. Le nom du paramètre doit impérativement être la chaîne fixe ReturnValue, pas de nom personnalisé
  2. Direction = ParameterDirection.ReturnValue
  3. Dans une procédure stockée SQL Server, return valeur_numerique ne prend que le type int
  4. La valeur de ce paramètre n’est lisible qu’après avoir exécuté ExecuteNonQuery()

  • Valeur return : une seule valeur autorisée, type int uniquement
  • Paramètre de sortie output : plusieurs paramètres possibles, compatibles avec de nombreux types de données

Différences

-- À l’intérieur de la procédure stockée
update Article set title='111' where id=4; -- On suppose une ligne modifiée
return 10; -- valeur retournée par return

Après exécution :

  • rowsAffected = 1 (lignes touchées par update)
  • procReturnVal = 10 (valeur transmise par return)

Synthèse

MéthodeContenu renvoyéCas d’usage
ExecuteReaderSqlDataReader (flux de plusieurs lignes)Lire plusieurs enregistrements
SqlDataAdapter.FillDataSet/DataTable (table hors‑ligne)Liaison de table pour contrôles WinForm
ExecuteScalarobject (première colonne de la première ligne)Récupérer un seul résultat agrégé
ExecuteNonQueryint(lignes affectées) + valeur ReturnValueInsertion / Mise à jour / Suppression, besoin d’un code d’état depuis procédure stockée

Procédure stockée Return

Previous:

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *