Avantages et Inconvénients de l'utilisation de SqlCommand Préparer en C#?
Quand je lisais les livres pour apprendre le C# (peut-être quelques vieux Visual Studio 2005
livres) que j'ai rencontré des conseils de toujours utiliser SqlCommand.Prepare
chaque fois que j'execute SQL appel (si son " un SELECT
/UPDATE
ou INSERT
sur SQL SERVER 2005/2008) et j'ai passer des paramètres à elle. Mais est-ce vraiment?
-
Faut-il le faire à chaque fois? Ou tout simplement, parfois?
-
Importe si c'est un paramètre passé cinq ou vingt?
-
Ce boost devrait-elle fournir le cas échéant? Serait-il être perceptible à tous (j'ai été en utilisant
SqlCommand.Prepare
ici et a sauté là-bas et jamais eu de problèmes ou de différences notables).
Pour le bien de la question, c'est mon habitude de code que j'utilise, mais c'est plus une question d'ordre général.
public static decimal pobierzBenchmarkKolejny(string varPortfelID, DateTime data, decimal varBenchmarkPoprzedni, decimal varStopaOdniesienia) {
const string preparedCommand = @"SELECT [dbo].[ufn_BenchmarkKolejny](@varPortfelID, @data, @varBenchmarkPoprzedni, @varStopaOdniesienia) AS 'Benchmark'";
using (var varConnection = Locale.sqlConnectOneTime(Locale.sqlDataConnectionDetailsDZP)) //if (varConnection != null) {
using (var sqlQuery = new SqlCommand(preparedCommand, varConnection)) {
sqlQuery.Prepare();
sqlQuery.Parameters.AddWithValue("@varPortfelID", varPortfelID);
sqlQuery.Parameters.AddWithValue("@varStopaOdniesienia", varStopaOdniesienia);
sqlQuery.Parameters.AddWithValue("@data", data);
sqlQuery.Parameters.AddWithValue("@varBenchmarkPoprzedni", varBenchmarkPoprzedni);
using (var sqlQueryResult = sqlQuery.ExecuteReader())
if (sqlQueryResult != null) {
while (sqlQueryResult.Read()) {
}
}
}
}
Précisions supplémentaires:
Si je bouge sqlQuery.Prepare()
comme dans le code ci-dessous exception est levée que la taille doit être explicitement déclarée, qui, fondamentalement, m'amène à penser que le fait d'avoir sqlQuery.Prepare()
comme premier fait-il inutile? Quelqu'un peut-il montrer la bonne utilisation de l'aide de mon exemple?
public static decimal pobierzBenchmarkKolejny(string varPortfelID, DateTime data, decimal varBenchmarkPoprzedni, decimal varStopaOdniesienia) {
const string preparedCommand = @"SELECT [dbo].[ufn_BenchmarkKolejny](@varPortfelID, @data, @varBenchmarkPoprzedni, @varStopaOdniesienia) AS 'Benchmark'";
using (var varConnection = Locale.sqlConnectOneTime(Locale.sqlDataConnectionDetailsDZP)) //if (varConnection != null) {
using (var sqlQuery = new SqlCommand(preparedCommand, varConnection)) {
sqlQuery.Parameters.AddWithValue("@varPortfelID", varPortfelID);
sqlQuery.Parameters.AddWithValue("@varStopaOdniesienia", varStopaOdniesienia);
sqlQuery.Parameters.AddWithValue("@data", data);
sqlQuery.Parameters.AddWithValue("@varBenchmarkPoprzedni", varBenchmarkPoprzedni);
sqlQuery.Prepare();
using (var sqlQueryResult = sqlQuery.ExecuteReader())
if (sqlQueryResult != null) {
while (sqlQueryResult.Read()) {
}
}
}
}
Comment dois-je procéder? En ajoutant .taille à côté de paramètres et de faire varPortfel.Longueur si c'est une chaîne de caractères etc?
Vous devez vous connecter pour publier un commentaire.
De la Documentation MSDN:
En général, est utilisé pour s'assurer que l'utilisateur final n'est pas à l'aide d'une Injection SQL de la technique d'ajouter ou de supprimer des informations que vous ne voulez pas trop à partir de la base de données.
J'ai regardé dedans et découvrez cet article http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.prepare.aspx. Votre problème est que vous devez définir vos paramètres avant de vous lancer .Prepare() et puis définissez vos paramètres après l'exécution .Prepare(). Maintenant vous faites tous les deux avant de. Je voudrais essayer quelque chose comme ceci (Notez que je n'ai pas tester donc ma syntaxe peut-être un peu off).
L'autre avantage, c'est que, ce faisant, la requête SQL plan est compilé, la mise en cache et ré-utilisé. Ce n'est pas une grosse affaire si, pour un faible volume d'appels à votre requête, mais si vous avez beaucoup il n'y a vraiment sont quelques-uns des avantages de performance significatifs à cet égard.
De ma propre expérience: le gain de performances est TRÈS importante. Il y a quelques temps, j'ai travaillé sur un projet où nous avons utilisé notre propre mapping objet-relationnel. Nous avons utilisé l'immense base de données comme un magasin permanent de complexe sur le modèle objet, sur demande, des objets de chargement et de faiblesse de l'objet référencé par la vie en temps.
À l'aide de commandes préparées a été crucial pour le succès de cette application, car il est seul à le système réellement utilisable.
En d'autres termes: si vous exécuter de nombreuses commandes SQL - que sont exactement les mêmes ou ne diffèrent que dans les valeurs de paramètre, vous verrez énorme gain de performance.
Je n'ai pas de chiffres exacts, ou des liens, mais je peux témoigner de ma propre expérience.
Selon IDbCommand.Préparer la documentation de la Méthode:
J'ai également trouvé ce Les Administrateurs de bases de données de réponse qui vous donne beaucoup de détails sur la
prepare
méthode et pourquoi je n'ai pas d'obtenir une amélioration significative.Sur l'injection SQL, vous serez protégé contre elle parce que vous avez utilisé un paramétrée sqlCommand... pas parce que vous avez appelé la méthode préparer.