【问题标题】:Return DataTable based on boolean param根据布尔参数返回 DataTable
【发布时间】:2010-12-04 15:48:45
【问题描述】:

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

有什么建议吗?

【问题讨论】:

    标签: c# winforms stored-procedures datatable boolean


    【解决方案1】:

    传递一个 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];
    }
    

    【讨论】:

      【解决方案3】:

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

      然后在您的代码中,将参数设置为可为空,并在您想要返回所有记录时传递一个空值。

      【讨论】:

        【解决方案4】:

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

        ALTER PROCEDURE p_selContractors ( @isActive bit = null )
        

        然后在您的 WHERE 子句中,使用以下内容:-

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

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

        【讨论】:

          【解决方案5】:

          一个快速简单的技巧是分别调用这两个过程并合并结果。 (我并不是说这是最好的选择,只是还没有人建议过)

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-09-18
            • 2019-06-10
            • 2011-12-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-10-09
            • 2019-07-31
            相关资源
            最近更新 更多