de mauvaises performances avec sqlparameter

J'ai un web service, de sorte que le gestionnaire est appelé plusieurs fois simultanément tous les temps.

L'intérieur, j'ai créer SqlConnection et SqlCommand. J'ai à exécuter environ 7 les différentes commandes. Les différentes commandes nécessitent des différents paramètres, donc je viens de les ajouter une fois:

command.Parameters.Add(new SqlParameter("@UserID", userID));
command.Parameters.Add(new SqlParameter("@AppID", appID));
command.Parameters.Add(new SqlParameter("@SID", SIDInt));
command.Parameters.Add(new SqlParameter("@Day", timestamp.Date));
command.Parameters.Add(new SqlParameter("@TS", timestamp));

Puis lors de l'exécution je viens de changer de CommandText prorerty et ensuite appeler la méthode ExecuteNonQuery(); ou ExecuteScalar();

Et je fais face à des problèmes de performances.
Par exemple peu de debuggin et de profilage de la montre, qui commande

command.CommandText = "SELECT LastShowTS FROM LogForAllTime WHERE UserID = @UserID";

prend environ 50ms dans avarage. Si je le modifier:

command.CommandText = "SELECT LastShowTS FROM LogForAllTime WHERE UserID = '" + userID.Replace("\'", "") + "'";

puis il prend seulement 1 ms dans avarage!

J'ai juste ne peux pas obtenir la moindre idée de l'endroit où étudier le problème.

Pouvez-vous dire: quel est le type défini de userID dans le C#, et quel est le type défini de la UserID colonne dans la base de données?
Êtes-vous sûr que c'est votre goulot d'étranglement des performances? Avez-vous profilée tout?
code d'utilisateur est une chaîne de caractères, en DB, il est de type varchar(20) est un PK
Eh bien, si j'ai coder en dur la déclaration de SSMS, profiler dit que c'est seulement 1ms. Puis-je enregistrer des horodateurs de code juste avant ExecuteNonQuery et juste après. Si j'utilise une chaîne direct, il est de 1ms, si j'utilise des param, il est 50ms. J'ai essayé de créer un sepearete objet de commande à séparer les param collecte et le résultat est le même.
pouvez-vous essayer explicitement la configuration du paramètre de type varchar? A C# string est unicode, donc (par défaut) les cartes de type nvarchar, pas de type varchar.

OriginalL'auteur | 2011-12-21