2009-10-07 87 views
0

我有一个表有一个字段,“IsActive”,表示记录是否已被“删除”。基于布尔参数返回DataTable

目前,我获取该信息,像这样:

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]; 
    } 

我DAL的代码和存储过程是无关的,所以我就省略了现在。

这是我的问题:如果我想要返回处于活动状态或不活动状态的记录,此代码正常工作......但是,如何修改此操作以返回所有记录(活动和非活动状态)?

现在,我有两个方法和两个存储过程(一个用IsActive参数,另一个没有参数),但我知道必须有一个更简单的方法。

有什么建议吗?

回答

3

传递一个NULL(分配DBNull.Value到参数)并修改您的存储过程来检查它,而不关心在这种情况下它是什么类型的记录。有些东西,如:

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

我喜欢这个解决方案很多:) +1 – 2009-10-07 14:59:04

+0

+1的答案。 :) – Sesame 2009-10-07 15:21:46

2

@IsActive可空和调整你的SQL代码:

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

此外,重构你的代码一点点,这样它更明确:

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回答问题和其他信息。 :) – Sesame 2009-10-07 15:22:22

0

改变你的存储过程。让它检查参数是否为空。如果它为空,则返回有效和无效。如果它不为空,则根据参数返回数据。

然后在您的代码中,使参数为空,并在您想要返回所有记录时传递null。

0

在你的存储过程,使@isActive参数为空的

ALTER PROCEDURE p_selContractors (@isActive bit = null) 

然后在你的WHERE子句中使用以下命令: -

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

而在你的C#代码,不设置@isActive参数值,你应该很酷。

0

一个快速而简单的黑客将分别调用这两个过程并合并结果。 (我并不是说这是最好的选择,只有一个,没有人曾建议尚未)

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);