Вопрос

Допустим, у меня есть класс

public class foo { public string FooId { get; set; } }

Теперь на моем уровне данных я пытаюсь написать код, который создаст один экземпляр IDataCommand и установит FooId в качестве одного из параметров команды, что-то вроде этого

public void save(foo f, IDbConnection conn)
{ 
    IDataCommand cmd = conn.CreateCommand(); 
    cmd.CommandName = "SP_SAVE_INFO" ; 
    IDataDbParameter param = cmd.CreateParameter(); 
    param.name = "@fooId"; 
    param.value=(f.id>0)?f.id:(object)DbNull.Value;
    cmd.parameters.add(param);
    cmd.ExecuteNonQuery();
}

Если вы заметили строку кода — param.value=(f.FooId >0)?f.id:(object)DbNull.Value;.Мой вопрос именно в этой области.Если у меня слишком много параметров для предоставления.Это выглядит немного плохо, когда я проверяю такое значение для каждого параметра.Вопрос в том, как лучше всего это сделать?Кто должен делать это DL или BL?Если BL, то следует ли ему присвоить ему значение DBNull?Есть ли другой стандартный способ сделать это?

Это было полезно?

Решение

Почему бы не попробовать универсальный метод расширения?

public static class IDataDbParameterExtensions
{
    public static void SetValue<T>(this IDataDbParameter parameter, T value)
    {
        if(value == default(T)) // for structs (ValueTypes) like Int, default(T) will be 0 and for classes (RefTypes), it will be null.
        {
            parameter.Value = DBNull.Value;
        }
        else
        {
            parameter.Value = value;
        }
    }
}

Используйте его следующим образом:

param.SetValue(f.id);

Другие советы

Самое полное решение — не делать этого самостоятельно.Существует множество фреймворков, которые вам здесь помогут — взгляните, например, на NHibernate или Entity Framework.

Если вам действительно нужно сделать это вручную, вы можете реорганизовать проверки в методы многократного использования.Что-то вроде этого:

  public void AddIntParameterWithNullForZero(IDataCommand command, string parameterName, int parameterValue) 
  {
    // Add the parameter and perform the checks here.
  } 
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top