2010-09-28 4 views
3

Consultez le code suivant:Paramètres sql inutilisés - sont-ils dangereux?

Dim sql = "SELECT * FROM MyTable WHERE value1 = @Param1" 

If someCondition Then 
    sql = sql + " AND value2 = @Param2" 
End If 

Dim cmd As New SqlCommand(sql, conn) 
cmd.Parameters.AddWithValue("@Param1", param1Value) 
cmd.Parameters.AddWithValue("@Param2", param2Value) 

En supposant que je construit une instruction SQL complexe dynamique qui peut ou peut ne pas avoir inclus le paramètre @Param2 - est-il mal à l'ajouter à la commande en tant que paramètre?

Mon vrai cas d'utilisation est évidemment beaucoup plus compliqué que cela, mais en général, est-ce un modèle que je devrais éviter; et si oui, pourquoi?

Répondre

2

Le seul point que je prendrais note est le fait que si vous appelez .AddWithValue, vous laissez à SQL Server de comprendre quel sera le type de données du paramètre. SQL Server fait un travail remarquablement bon de deviner - mais parfois, il l'obtient "sous-optimale" et il serait utile que vous fournissiez les détails.

donc je tends personnellement à toujours utiliser ce bout de code:

SqlParameter aParam = new SqlParameter("@Param1", SqlDbType.VarChar, 50); 
aParam.Value = param1Value; 

Cela présente deux avantages principaux:

  • vous de définir le type explicite, ce qui est important par exemple lors de l'utilisation de VARCHAR par rapport à NVARCHAR (sinon vous risquez d'avoir beaucoup de conversions de type inutiles)
  • Vous pouvez définir la longueur maximale, par ex. paramètres de chaîne

Vous pouvez facilement envelopper ceci dans un exemple. static helper class, ou même l'utiliser comme une méthode d'extension. C'est un peu plus de travail, mais vous obtenez plus de contrôle et vous éviterez des conversions inutiles et fastidieuses de type de données et d'autres effets secondaires inattendus si vous laissez à SQL Server le soin de deviner vos types.

+0

@marc_s: Je suis en train de faire cela, je voulais juste simplifier mon exemple de code. – DanP

+0

@DanP: ok, super - c'est mon seul point à savoir quand il s'agit d'utiliser des paramètres avec le code ADO.NET –

+0

@marc_s: Qu'en est-il de ma question originale? utilise des paramètres comme je l'ai décrit une mauvaise idée? – DanP

0

Il est toujours recommandé d'éviter de transmettre des paramètres qui ne sont pas nécessaires. Si vous transmettez un paramètre qui n'a pas de valeur, il va soit supposer que vous cherchez une chaîne vide, ou il vous donnera une erreur qu'il ne peut pas traiter la demande.

+0

Juste pour clarifier, les paramètres ont tous une valeur valide, ils peuvent ou peuvent ne pas apparaître dans l'instruction sql résultante que j'envoie au serveur. – DanP

+0

Dans ce cas, vous ne devriez toujours pas les avoir dans votre requête, sauf si vous voulez avoir la possibilité d'avoir de mauvaises données retournées ou des erreurs si les paramètres ne sont pas dans la table que vous interrogez. Un bon exemple de ceci serait si vous utilisez une jointure sur une table pour interroger les résultats. Avoir un paramètre supplémentaire dans votre requête peut grandement changer les données qui doivent être retournées ou vous obtiendrez des erreurs disant que la colonne n'existe pas. – hav2play21

+0

Je ne pense pas que vous suivez ... laissez-moi mettre à jour ma question en conséquence ... – DanP

Questions connexes