2010-02-25 4 views
2

je le code suivant:Comment ajouter un « tout sélectionner » valeur à une requête paramétrée en C# et MS SQL

Comme vous pouvez le voir, je dois passer un paramètre à Champ2, mais je dois aussi que paramètre à utiliser pour gérer l'option "" toutes les valeurs ", par exemple, si j'affecte" foo "au paramètre, la requête retournera chaque enregistrement où Field2 =" foo "... mais je veux aussi pouvoir passer un joker, ou quelque chose à dire que le paramètre de donner toutes les valeurs comme résultat.

MyDataset dataset = new MyDataset(); 
SqlConnection objConnection = new SqlConnection(_connectionstring); 
SqlDataAdapter objDataAdapter = new SqlDataAdapter(); 
objDataAdapter.SelectCommand = new SqlCommand(); 
objDataAdapter.SelectCommand.Connection = objConnection; 
objDataAdapter.SelectCommand.CommandText = 
"SELECT Field1, Field2, Field3 FROM Table WHERE (Field2 = @Field2)"; 
objDataAdapter.SelectCommand.CommandType = CommandType.Text; 
objDataAdapter.SelectCommand.Parameters.AddWithValue("@Field2", txtBoxField2.Text); 
objDataAdapter.Fill(dataset.Table); 
this.DataContext = dataset.Table.DefaultView; 

Nous vous remercions à l'avance.

Répondre

1

Si vous construisez le SQL comme cela dans votre code C#, mettez simplement une condition if dans votre logique C# pour ne pas inclure la clause WHERE dans l'instance où vous voulez renvoyer tous les enregistrements. Cela créerait une instruction SQL différente, ce qui serait OK pour les performances/exécution plan-sage.

Si vous allez utiliser un sproc, vous pouvez essayer cette approche:

IF (@Field2 = 'SomeWildcardValue') 
    SELECT Field1, Field2, Field3 FROM SomeTable 
ELSE 
    SELECT Field1, Field2, Field3 FROM SomeTable WHERE Field2 = @Field2 

Ou encore, les garder complètement séparés, créez un sproc pour retourner tous, et un à rendement fondé sur Champ2 chercher. Bien que si vous avez un plus grand nombre de paramètres, cela peut bientôt monter!

+0

Oui, vous voyez que j'ai un grand nombre de paramètres ... le code que j'ai posté n'est qu'un exemple. Je cherche un workaraound pour ne pas construire une grande quantité de code if else. –

3

Une façon de le faire est d'utiliser des paramètres nullables:

SELECT Field1, Field2, Field3 
FROM Table 
WHERE (@Field2 IS NULL OR Field2 = @Field2) 

mais vous devez savoir que cela peut conduire à des plans de requête correctement mises en cache dans certaines circonstances où il y a de nombreux paramètres. Si vous utilisez SQL Server 2005+, cela peut être réduit à un important ectent utilisant OPTIMIZE FOR.

Assurez-vous également que vos statistiques sont à jour.

+0

Merci pour le lien, en fait le tester dans le code réel (où j'ai beaucoup de paramètres) a entraîné des problèmes de performance. –

+0

@Enrico Castellani: assurez-vous que vos statistiques sont à jour. –

0

En général, j'utiliserais la méthode de paramètre nullable dans un SP. Basé sur votre code cependant, pourquoi ne construisez-vous pas le texte de commande SQL basé sur ce que l'utilisateur a entré? Par exemple, seulement ajouter une clause where au SQL si l'utilisateur a entré quelque chose dans la zone de texte, sinon, juste une simple sélection.

Questions connexes