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 @coutest la valeur de retour de la procédure stockée, à ne pas confondre avec le paramètre de sortieoutput.
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
- Le nom du paramètre doit impérativement être la chaîne fixe
ReturnValue, pas de nom personnalisé Direction = ParameterDirection.ReturnValue- Dans une procédure stockée SQL Server,
return valeur_numeriquene prend que le type int - 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éthode | Contenu renvoyé | Cas d’usage |
|---|---|---|
| ExecuteReader | SqlDataReader (flux de plusieurs lignes) | Lire plusieurs enregistrements |
| SqlDataAdapter.Fill | DataSet/DataTable (table hors‑ligne) | Liaison de table pour contrôles WinForm |
| ExecuteScalar | object (première colonne de la première ligne) | Récupérer un seul résultat agrégé |
| ExecuteNonQuery | int(lignes affectées) + valeur ReturnValue | Insertion / Mise à jour / Suppression, besoin d’un code d’état depuis procédure stockée |
Procédure stockée Return
Previous: SqlDataAdapter