Условно нулевые значения внутри списка SqlParameters - PullRequest
2 голосов
/ 02 февраля 2012

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

Базовый код:

var SqlParams = new List<SqlParameter> {
    new SqlParameter("@SomeFloat", SqlDbType.FLoat) {Value = f},
    ....
}

Я пробовал несколько вариантов чего-либо, ноэто не сработало, и VS выдает ошибку об отсутствии неявного преобразования между float и null.

new SqlParameter("@SomeFloat", SqlDbType.Float) {Value = (!string.IsNullOrEmpty(tb.Text) ? double.Parse(tb.Text) : DBNull.Value)},

Есть ли способ сделать это, поддерживая список параметров, чтобы нам не пришлось переписывать весь модуль?

Спасибо

Ответы [ 3 ]

4 голосов
/ 02 февраля 2012

Вы почти у цели, вам просто нужно убедиться, что условный оператор знает, каким должен быть его результат. Примените одну из double.Parse или DBNull.Value к object

Я также снял некоторые скобки и поменял условие, чтобы его было легче удалить.

new SqlParameter("@SomeFloat", SqlDbType.Float) 
    {
        Value = string.IsNullOrEmpty(tb.Text) 
            ? DBNull.Value
            : (object)double.Parse(tb.Text)
    }

Однако я обычно делал бы что-то подобное

if (!string.IsNullOrEmpty(tb.Text))
     command.Parameters.AddWithValue("@SomeFloat", double.Parse(tb.Text));

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

1 голос
/ 02 февраля 2012

Это хороший вариант для расширения:

    public static object TryParseSqlValue(this object input)
    {
        if (null == input)
            return DBNull.Value;
        if (input.GetType() == typeof(string) && input.ToString() == string.Empty)
            return DBNull.Value;
        else
            return input;
    }

myTextBox.Text.TryParseSqlValue();  // returns either the non-empty 
                                    // string or DBNull.Value

Вы можете изменить его для других типов данных ...

1 голос
/ 02 февраля 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...