Вопрос

Попытка присвоить двоичному полю значение null выдает мне исключение ArgumentNull .Я могу сделать поле пустым следующим образом new Binary(new byte[] {}); но это не null, а просто пустой столбец.Есть ли обходной путь с использованием LinqToSql ?

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

Решение

У тебя происходит что-то еще.Я только что создал небольшой образец таблицы с идентификатором (identity), обнуляемым varbinary (MAX), ненулевым varbinary (MAX) и отметкой времени.Использование следующего кода работает просто отлично, без ошибок.

using (var context = new TestDataContext())
{
    var binarySample = new BinarySample
    {
        Image = null,
        NonNullImage = new Binary( new byte[0] ),
    };
    context.BinarySamples.InsertOnSubmit( binarySample );
    context.SubmitChanges();
}

Где, поскольку этот код правильно выдает (и улавливает) SQLException, а не ArgumentNullException .

try
{
    using (var context = new TestDataContext())
    {
        var binarySample2 = new BinarySample
        {
            NonNullImage = null,
            Image = new Binary( new byte[0] )
        };
        context.BinarySamples.InsertOnSubmit( binarySample2 );
        context.SubmitChanges();
    }
}
catch (SqlException e)
{
    Console.WriteLine( e.Message );
}

Возможно ли, что у вас есть частичная реализация класса, которая имеет обработчик SendPropertyChanging для свойства, вызывающего исключение ArgumentNullException?

Редактировать:основываясь на комментарии OP.

Обратите внимание, что вы не можете присвоить переменную типа byte[] двоичному файлу напрямую, поскольку это вызывает неявная операция преобразования и неявное преобразование вызовет исключение ArgumentNullException .Вы должны проверить, равно ли значение null, прежде чем пытаться присвоить его, и просто присвоить null, если переменная byte[] равна null.Мне это кажется странным поведением, и я хотел бы надеяться, что они изменят его в будущем.Документация MSDN указывает, что в будущих версиях могут произойти некоторые изменения.

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

Вы уверены, что это поле обнуляется в базе данных?Обновлена ли соответствующим образом модель данных linq?При использовании сопоставления на основе атрибутов должно быть CanBeNull=true установка в [Column(...)] атрибут.

@tvanfosson (опубликовано в качестве ответа для улучшения форматирования кода)

Да, вы правы, происходит что-то странное, что-то за пределами моих знаний C #.

От.ImageThumbnail - это байт[] to.ImageThumbnail является двоичным

Используя ?или ??операторы не будут работать, если я просто использую if else, это работает, странно.Я не понимаю, почему :-)

            if (from.ImageThumbnail != null) // works
            {
                to.ImageThumbnail = from.ImageThumbnail;
            }
            else
            {
                to.ImageThumbnail = null;
            }

            to.ImageThumbnail = from.ImageThumbnail != null ? from.ImageThumbnail : null; // fails

            to.ImageThumbnail = from.ImageThumbnail ?? null; // fails

Вы могли бы использовать ExecuteQuery() выполнить запрос() метод для передачи вашего собственного SQL.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top