2010-05-21 2 views
1

Lors du codage avec sqlite chaque fois que j'avais toujours le nombre exact de paramètres et quand j'ai exécuté la requête j'ai toujours eu 0 paramètres après. J'ai continué à utiliser l'objet cmd et ça a bien fonctionné.Pourquoi la connexion SQL laisse-t-elle des paramètres?

Maintenant lors du portage pour utiliser le serveur sql (2008), mon SqlConnection a des paramètres restants d'une commande réussie. Pourquoi? Je semble être capable de créer des tables sans le problème (là encore je peux avoir utilisé un clone d'un cmd vide puisque j'utilise la récursivité). Est-ce que SqlCommand laisse toujours les paramètres après une requête? Cela casse toujours la requête suivante à moins que je ne fasse paramètre.clear().

Devrais-je créer un nouvel objet SqlCommand? ou utilisez parameter.clear() à chaque fois? Je suis un peu confus.

Répondre

2

Bien sûr, il laisse ceux là - vous ne l'avez jamais dit autrement.

Et si vous deviez appeler la même SqlCommand des centaines de fois de suite - voulez-vous continuer à recréer tous les paramètres après chaque appel ?? Ça n'a pas beaucoup de sens pour moi ....

Mon conseil: utilisez une SqlCommand par "commande" ou "requête" que vous voulez exécuter et configurez ses paramètres si nécessaire. Je ne "recyclerais" pas un seul SqlCommand pour une douzaine de requêtes différentes ... juste en créer une nouvelle! Ce n'est certainement pas une opération coûteuse.

+0

Que faites-vous dans une fonction avec plusieurs requêtes qui ne peuvent pas être une déclaration longue avec plusieurs ';'? Est-ce que vous faites un cmd pour chacun d'eux? En ce moment je fais .clone() avant chaque requête pour le moment. –

+0

Oui, j'aurais un SqlCommand pour chaque "étape" ou instruction, et je continuerais simplement à définir les nouvelles valeurs de paramètres pour chaque fois que vous devez les appeler. Semble plus facile et plus propre que d'avoir un seul SqlCommand et le clonage qui .... –

2

Je suppose que c'est au fournisseur d'effacer ou non la liste des paramètres chaque fois que vous exécutez la commande. Personnellement, je pense que la façon SqlCommand plus de sens, parce que je peux faire quelque chose comme ceci:

var cmd = new SqlCommand("SomeSprocName", ...); 
cmd.Parameters.Add("@param1", SqlDbType.NVarChar).Value = "some string"; 
cmd.Parameters.Add("@param2", SqlDbType.Int); 

for(int i = 0; i < 10; i++) 
{ 
    cmd.Parameters["@param2"].Value = i; 
    cmd.ExecuteNonQuery(); 
} 

C'est, je peux exécuter la même commande sur basculantes dans une boucle et seulement changer la paramètres qui sont réellement différents.

Si vous exécutez une commande totalement différente, je dirais qu'il est probablement logique de créer simplement une autre instance de l'objet de commande. Il ne faut pas pour appeler cmd.Parameters.Clear() et rajouter les nouveaux paramètres, mais il y a d'autres propriétés sur l'objet de commande qui peuvent affecter l'exécution (par exemple CommandType, CommandTimeout, etc.) et si vous exécutez une nouvelle commande entière , il est plus logique de repartir de zéro.

+0

Aussi, si je ne me trompe pas, garder les paramètres améliore les performances. – AMissico

+1

J'aime que SqlCommand conserve les paramètres. – AMissico