0 votes

Aide à la paramétrisation d'une requête SQL pour C# avec des valeurs nulles possibles

J'ai besoin d'aide pour paramétrer cette requête.

SELECT * 
FROM greatTable 
WHERE field1 = @field1
AND field2 = @field2

L'utilisateur doit pouvoir rechercher n'importe lequel des deux champs, et il doit également pouvoir rechercher si le champ 2 a des valeurs nulles.

var query = "theQuery";
var cm = new SqlCommand(cn, query);

cm.AddParameter("@field1", "352515");
cm.AddParameter("@field2", DBNull.Value);

// my DataTable here is having 0 records
var dt = GetTable(cm);

[ Editer ]

Quelle est la meilleure alternative ?

  1. Garder le CommandText constant pour que le plan en Sql puisse être réutilisé

    WHERE (field2 = @field2 OR @field2 IS NULL)

  2. Modifier dynamiquement le texte de la commande en fonction des valeurs introduites par l'utilisateur.

    WHERE field2 IS NULL

Je ne pense pas à un seul domaine, mais à plusieurs.

3voto

Espo Points 24318

Vous pouvez utiliser AND (@field2 IS NULL OR field2 = @field2) pour que la requête renvoie toutes les lignes sans vérifier field2 (pour vous permettre de passer DbNull dans votre code). La requête complète serait quelque chose comme ceci :

SELECT * 
FROM greatTable 
WHERE field1 = @field1
AND (@field2 IS NULL OR field2 = @field2)

Notez que l'utilisation de cette méthode peut entraîner une baisse des performances en raison de l'indexation. Jetez un coup d'œil à cet article pour plus de détails.

0voto

Zielyn Points 246

Une sale méthode : isnull(field2,0) = isnull(@param2,0)

avoir l'isnull quelque chose qui ne serait jamais dans le champ ou le param

0voto

Oleg Points 136406

C'est une bonne question, mais dans la pratique, je n'ai pas eu le temps de rencontrer ce problème. Si j'utilise AddParameter je construis également la chaîne de la requête dans le même fragment de code. Ainsi, si je sais que je dois rechercher "@field2" égal à NULL, je décide de construire ou non

string query = "SELECT * " +
    "FROM greatTable " +
    "WHERE field1 = @field1";

ou

string query = "SELECT * " +
    "FROM greatTable " +
    "WHERE field1 = @field1 AND field2 IS NULL";

et n'ajoute qu'un seul paramètre

cm.AddParameter("@field1", "352515");

Je n'ai donc pas le temps le problème que vous décrivez.

MISE À JOUR : La meilleure (ou la seule correcte) façon d'obtenir l'avis des utilisateurs est NULLE, vous devez en décider en fonction du contexte. Dans la plupart des cas, "AND field2 IS NULL" n'est pas nécessaire, mais j'ai lu votre question de telle sorte que dans votre cas particulier, l'utilisateur peut explicitement choisir non pas "" (chaîne vide), mais une valeur NULL.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X