Возвращает DataTable на основе логического параметра - PullRequest
0 голосов
/ 07 октября 2009

У меня есть таблица с полем «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 ]

3 голосов
/ 07 октября 2009

Передайте NULL (присвойте параметру DBNull.Value) и измените свою хранимую процедуру, чтобы проверить это, и не обращайте внимания на то, какой это тип записи в данных обстоятельствах. Что-то вроде:

.... WHERE MyTable.IsActive = COALESCE(@IsActive, MyTable.IsActive)
2 голосов
/ 07 октября 2009

Сделайте @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];
}
0 голосов
/ 07 октября 2009

Быстро и легко взломать было бы вызвать обе процедуры по отдельности и объединить результаты.(Я не говорю, что это лучший вариант, только тот, который еще никто не предлагал)

т.е.

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);
0 голосов
/ 07 октября 2009

В вашем sproc, установите параметр @isActive обнуляемым

ALTER PROCEDURE p_selContractors ( @isActive bit = null )

Затем в предложении WHERE используйте следующее: -

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

И в своем коде C # не устанавливайте значение параметра @isActive, и вы должны быть крутыми.

0 голосов
/ 07 октября 2009

изменить вашу хранимую процедуру. Пусть он проверит, является ли параметр пустым. если он нулевой, вернуть как активный, так и не активный. если оно не равно нулю, вернуть данные в зависимости от параметра.

затем в вашем коде сделайте параметр обнуляемым и передайте нуль, если вы хотите вернуть все записи.

...