C# 基于布尔参数的返回数据表

C# 基于布尔参数的返回数据表,c#,winforms,stored-procedures,datatable,boolean,C#,Winforms,Stored Procedures,Datatable,Boolean,我有一个表,其中有一个字段“IsActive”,用于指示记录是否已被“删除” 目前,我检索此信息的方式如下: public DataTable GetContractors(bool IsActive) { SqlParameter paramIsActive = new SqlParameter("@IsActive", SqlDbType.Bit); paramIsActive.Value = IsActive; DataSet

我有一个表,其中有一个字段“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参数,另一个不带param),但我知道一定有更简单的方法


有什么建议吗?

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

@IsActive
设为null,并按如下方式调整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];
}
传递一个NULL(将
DBNull.Value
赋值给参数)并修改存储过程以检查它,而不关心在这种情况下它是什么类型的记录。比如:

.... WHERE MyTable.IsActive = COALESCE(@IsActive, MyTable.IsActive)
传递一个NULL(将
DBNull.Value
赋值给参数)并修改存储过程以检查它,而不关心在这种情况下它是什么类型的记录。比如:

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

更改存储过程。让它检查参数是否为null。如果为null,则返回active和not active。如果不为null,则根据参数返回数据


然后在代码中,使参数为null,并在希望返回所有记录时传递null。

更改存储过程。让它检查参数是否为null。如果为null,则返回active和not active。如果不为null,则根据参数返回数据


然后在代码中,使参数为null,并在希望返回所有记录时传递null。

在存储过程中,使@isActive参数为null

ALTER PROCEDURE p_selContractors ( @isActive bit = null )
然后在WHERE子句中,使用以下内容:-

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

在C代码中,不要设置@isActive参数值,你应该保持冷静。

在存储过程中,将@isActive参数设置为null

ALTER PROCEDURE p_selContractors ( @isActive bit = null )
然后在WHERE子句中,使用以下内容:-

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

在你的C代码中,不要设置@isActive参数值,你应该保持冷静。

一个简单快捷的方法是分别调用这两个过程并合并结果。 (我并不是说这是最好的选择,只是还没有人提出)

i、 e


一个简单快捷的方法是分别调用这两个过程并合并结果。 (我并不是说这是最好的选择,只是还没有人提出)

i、 e

我非常喜欢那个解决方案