C# 基于布尔参数的返回数据表
我有一个表,其中有一个字段“IsActive”,用于指示记录是否已被“删除” 目前,我检索此信息的方式如下: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
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 我非常喜欢那个解决方案