2009-10-07 5 views
0

J'ai une table qui a un champ, "IsActive", qui indique si un enregistrement a été "supprimé" ou non.Retour DataTable basé sur boolean param

Actuellement, je récupère cette information comme ceci:

public DataTable GetContractors(bool IsActive) 
    { 
     SqlParameter paramIsActive = new SqlParameter("@IsActive", SqlDbType.Bit); 
     paramIsActive.Value = IsActive; 
     DataSet ds = this.SQLDataAccess.ExecSProcReturnDataset(this.AppConfig.ConnectString, "p_selContractors", paramIsActive); 
     return ds.Tables[0]; 
    } 

Le code pour mon DAL et la procédure stockée est hors de propos, donc je vais omettez que pour l'instant.

Voici ma question: ce code fonctionne très bien si je veux retourner des enregistrements qui sont actifs ou qui ne sont pas actifs ... mais, comment est-ce que je modifierais cela pour retourner tous les enregistrements (actifs et inactifs)?

À l'heure actuelle, j'ai deux méthodes et deux procs stockés (un avec le paramètre IsActive et l'autre sans le param), mais je sais qu'il doit y avoir un moyen plus facile.

Des suggestions?

Répondre

3

Passez un entier NULL (attribuer DBNull.Value à la paramètre) et modifier votre procédure stockée pour vérifier cela et ne pas se soucier quel type d'enregistrement il est dans cette circonstance. Quelque chose comme:

.... WHERE MyTable.IsActive = COALESCE(@IsActive, MyTable.IsActive) 
+0

J'aime beaucoup cette solution :) +1 –

+0

+1 pour la réponse. :) – Sesame

2

Faites @IsActive annulable et modifier votre code SQL comme ceci:

select ... from ... t 
where ... 
and (@IsActive is null or t.IsActive = @IsActive) 

Plus, refactoriser votre code un peu afin qu'il soit plus explicite:

public DataTable GetContractors(bool isActive) 
{ 
    return GetContractors((bool?)isActive);   
} 

public DataTable GetAllContractors() 
{ 
    return GetContractors(null); 
} 

private DataTable GetContractors(bool? isActive) 
{ 
    SqlParameter paramIsActive = new SqlParameter("@IsActive", SqlDbType.Bit); 
    paramIsActive.Value = isActive == null ? DBNull.Value : (object)isActive.Value; 

    DataSet ds = this.SQLDataAccess.ExecSProcReturnDataset(
     this.AppConfig.ConnectString, "p_selContractors", paramIsActive); 

    return ds.Tables[0]; 
} 
+0

+1 pour répondre à la question et des informations supplémentaires. :) – Sesame

0

changez votre procédure stockée. Faites-le vérifier si le paramètre est nul. si c'est nul, retournez les deux actifs et non actifs. si ce n'est pas NULL, renvoyez les données en fonction du paramètre.

puis dans votre code, rendez le paramètre nullable, et passez une valeur nulle lorsque vous voulez retourner tous les enregistrements.

0

Dans votre sproc, faites le paramètre @isActive annulable

ALTER PROCEDURE p_selContractors (@isActive bit = null) 

Ensuite, dans votre clause WHERE, utilisez ce qui suit: -

WHERE 
    (@isActive IS NULL OR Active = @isActive) 

Et dans votre code C#, ne définissez pas la Valeur du paramètre @isActive, et vous devriez être cool.

0

Un hack rapide et facile consisterait à appeler les deux procédures séparément et à fusionner les résultats. (je ne dis pas que c'est la meilleure option, seule que personne n'a suggéré encore)

à savoir

var dt = this.SQLDataAccess.ExecSProcReturnDataset(this.AppConfig.ConnectString, "p_selContractors", true).Tables[0]; 
var dt2 = this.SQLDataAccess.ExecSProcReturnDataset(this.AppConfig.ConnectString, "p_selContractors", false).Tables[0]; 
dt.Merge(dt2, false); 
Questions connexes