我有一个表格,其中有一个字段“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参数,另一个带有参数),但我知道必须有一个更简单的方法。
有什么建议吗?
答案 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);