返回基于布尔参数的DataTable

时间:2009-10-07 14:35:44

标签: c# winforms stored-procedures datatable boolean

我有一个表格,其中有一个字段“IsActive”,表示记录是否已被“删除”。

目前,我检索此信息的方式如下:

    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参数,另一个带有参数),但我知道必须有一个更简单的方法。

有什么建议吗?

5 个答案:

答案 0 :(得分:3)

传递一个NULL(将DBNull.Value赋值给参数)并修改存储过程以检查它,而不关心它在那种情况下的记录类型。有点像:

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

答案 1 :(得分: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];
}

答案 2 :(得分:0)

更改您的存储过程。检查参数是否为空。如果它为null,则返回活动和非活动。如果它不为null,则根据参数返回数据。

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

答案 3 :(得分:0)

在你的sproc中,使@isActive参数可以为空

ALTER PROCEDURE p_selContractors ( @isActive bit = null )

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

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

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

答案 4 :(得分: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);