cmd.Parameters.AddWithValue nullable int - PullRequest
1 голос
/ 30 июня 2011

В моем классе слоя данных я инициализирую параметр следующим образом:

private int? _DependencyID;

public int? DependencyID
{ get {return _DependencyID;} set {_DependencyID = value;} }

public ConstructorMethod()
{
    _DependencyID = (int?)null;
}

В методе класса Insert () я пытаюсь

cmd.AddWithValue("@DependencyID", _DependencyID);

Если _DependencyID имеет значение, все хорошо. Если _DependencyID равен нулю, я получаю ошибку:

Параметризованный запрос «(@ ​​Param1 (NVARCHAR (10), @ param2 (nvarchar (255), ожидает параметр "@DependecyID", который был не поставляется

Я нашел эту [статью] [1], поэтому я попытался настроить код следующим образом:

cmd.AddWithValue("@DependencyID", _DependencyID == null? DBNull.Value : _DependencyID); 

                           and
cmd.AddWithValue("@DependencyID", _DependencyID == null? (int?) DBNull.Value : _DependencyID); 

В любом случае, есть проблемы. Как мне справиться с этим?

Заранее спасибо за любую помощь

Ответы [ 3 ]

5 голосов
/ 30 июня 2011

Вам нужно добавить object:

cmd.AddWithValue("@DependencyID", _DependencyID == null? DBNull.Value : (object)_DependencyID); 

Вы можете сократить это значение до

cmd.AddWithValue("@DependencyID", (object)_DependencyID ?? DBNull.Value); 
1 голос
/ 18 августа 2014

Я создал расширение для простого кода.

public static class SQLExtension
{
    public static SqlParameter AddWithNullable<T>(
        this SqlParameterCollection collection, 
        string parameterName, 
        Nullable<T> value) where T : struct, IComparable
    {
        return collection.AddWithValue(
            parameterName, (value.HasValue ? value.Value : (object)DBNull.Value)
        );
    }
}

Вот как вы можете его использовать.

cmd.AddWithNullable("@DependencyID", _DependencyID);
0 голосов
/ 30 июня 2011

AFAIC, ADO.NET/SQL не поддерживает обнуляемые типы таким образом.

Последний пример выглядит наиболее корректным для меня. Какие проблемы у вас с этим? Если вы только что получили ошибку компиляции, связанную с типами, введите приведите ваше значение к объекту:

(object)DependencyID.Value;

Поскольку оба значения по обе стороны от : должны быть одного типа.

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