2009-10-07 4 views
0

У меня есть таблица с полем «IsActive», которая указывает, была ли запись «удалена» или нет.Return DataTable на основе логического параметра

В настоящее время я получить это информация, как так:

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, а другой без параметра), но я знаю, что должен быть более простой способ.

Любые предложения?

ответ

3

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

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

Мне нравится это решение много :) +1 –

+0

+1 для ответа. :) – Sesame

2

Сделать @IsActive обнуляемым и настроить ваш SQL код, как это:

select ... from ... t 
where ... 
and (@IsActive is null or t.IsActive = @IsActive) 

Plus, реорганизовать ваш код чуточку, так что это более четко:

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

+1 для ответа на вопрос и дополнительную информацию. :) – Sesame

0

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

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

0

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

ALTER PROCEDURE p_selContractors (@isActive bit = null) 

Тогда в вашем ИНЕКЕ, используйте следующее: -

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

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

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); 
Смежные вопросы