Lors de l'exécution d'une procédure stockée, quel est l'avantage d'utiliser CommandType.StoredProcedure par rapport à CommandType.Text?
Donc en C# pour utiliser une procédure stockée j'ai le code suivant (code de connexion omis):
string sql = "GetClientDefaults";
SqlCommand cmd = new SqlCommand(sql);
cmd.CommandType = CommandType.StoredProcedure; //<-- DO I NEED THIS??
cmd.Parameters.AddWithValue("@computerName", computerName);
Où le sql est le nom d'une procédure stockée. Maintenant, ce code semble fonctionner très bien avec et sans la ligne de commentaire.
Donc, ai-je besoin de cette ligne? Est-il des performances (ou autre) au profit de la définition de cette? Est-il un avantage à ne PAS le mettre ou le paramètre de Texte?
source d'informationauteur MAW74656
Vous devez vous connecter pour publier un commentaire.
Selon les tests dans ce blog SQL Server fera le paramétrage pour vous, en enveloppant votre déclaration dans sp_executesql, lorsque vous utilisez
CommandType.Text
. Mais lorsque vous utilisezCommandType.StoredProcedure
vous permettra de paramétrer et ainsi sauvegarder la base de données de quelques travaux. La dernière méthode est plus rapide.Edit:
Installation
J'ai fait quelques tests moi-même et voici les résultats.
Créer cette procédure:
Ajouter une trace à l'aide de SQL Server Profiler.
Et ensuite l'appeler à l'aide du code suivant:
Résultats
Dans les deux cas, les appels sont effectués à l'aide de RPC.
Voici ce que la trace révèle à l'aide de
CommandType.Text
:Et voici le résultat à l'aide de
CommandType.StoredProcedure
:Comme vous pouvez le voir le texte de l'appel est enveloppé dans un appel à
sp_executesql
de sorte qu'il est correctement paramétrée. Ce sera bien sûr de créer une légère surcharge, et donc ma déclaration précédente, que l'utilisation deCommandType.StoredProcedure
est plus rapide, est encore debout.Une autre chose à noter, et qui est aussi une sorte de deal breaker ici, c'est que lorsque j'ai créé la procédure sans valeurs par défaut j'ai l'erreur suivante:
La raison pour cela est la façon dont l'appel à
sp_executesql
est créé, vous pouvez voir les paramètres sont déclarées et initialisées, mais ils ne sont pas utilisés. Pour l'appel à travailler, il devrait ressembler à ceci:Sens, lorsque vous utilisez
CommandType.Text
vous devez ajouter les paramètres à l'CommandText
sauf si vous voulez toujours les valeurs par défaut seront utilisées.Donc, pour répondre à votre question
CommandType.StoredProcedure
est plus rapide.CommandType.Text
alors vous aurez à ajouter les noms de paramètre à l'appel de la procédure, sauf si vous voulez les valeurs par défaut seront utilisées.Vous, cela afin de permettre ADO.NET pour vous y aider. Lorsque vous utilisez
CommandType.StoredProcedure
vous avez juste à mettreCommandText
égal au nom de la procédure stockée.Par exemple, ceci:
Est équivalent à:
Il est en fait une énorme différence. Si vous spécifiez le type de commande
StoredProcedure
puis n'importe quel paramètre que vous ajoutez à votre SqlCommand sera un paramètre ajouté le appel de procédure. Si vous le laissez telText
ensuite les paramètres seront ajoutés à la lotpas à la procédure. Pour illustrer ce point, permet de créer un mannequin de procédure:Ensuite compiler cette petite application en C#:
Le résultat est:
Ouch! Pour le
CommandType.Text
cadre, même si les paramètres ont été transmis à la lotils n'ont pas été transmis à la procédure. Source de beaucoup d'heures de débogage de plaisir...CommandType n'est pas spécifique à SQL Server. C'est une propriété de la IDbCommand interface qui indique le fournisseur sous-jacent pour traiter la CommandText d'une manière spécifique. Alors que SQL Server peut traiter d'un seul mot en tant que noms de procédures, vous ne devriez pas attendre que cela fonctionne dans d'autres fournisseurs.
En général, vous devriez préférer l'aide du fournisseur-classes générées comme DbCommand au lieu de classes spécifiques comme SqlCommand. De cette façon, vous pouvez cibler les différentes bases de données en changeant simplement une chaîne de fournisseur dans votre fichier de configuration.