Неявное преобразование из типа данных nvarchar в varbinary(max) не допускается

Я получаю это исключение, когда пытаюсь вставить DBNull.Value в пустое поле varbinary(max):

Implicit conversion from data type nvarchar to varbinary(max) is not allowed. Use the CONVERT function to run this query.

Вот мой код:

  insertCMD.Parameters.AddWithValue("@ErrorScreenshot", SqlDbType.VarBinary).Value = DBNull.Value;

Я знаю, что на SO существуют повторяющиеся вопросы, но я НЕ использую Строку, как другие.

Что я не прав?

ОБНОВИТЬ:

using (var insertCMD = new SqlCommand("INSERT INTO TestplanTeststep (TeststepId,TestplanId,CreatedAt,ErrorText,ErrorScreenshot,TestState) VALUES (@TeststepId, @TestplanId,@CreatedAt,@ErrorText,@ErrorScreenshot,@TestState)", con))
{
 var p1 = insertCMD.Parameters.Add("@TeststepId", SqlDbType.Int);
 var p2 = insertCMD.Parameters.Add("@CreatedAt", SqlDbType.DateTime);
 insertCMD.Parameters.AddWithValue("@TestplanId", testplan.Id);
 insertCMD.Parameters.AddWithValue("@ErrorText", (object) DBNull.Value);
 insertCMD.Parameters.AddWithValue("@ErrorScreenshot", (object) DBNull.Value);
 insertCMD.Parameters.AddWithValue("@TestState", (int)Teststep.TeststepTestState.Untested);

       foreach (Teststep step in teststeps)
        {
           p1.Value = step.Id;
           p2.Value = step.CreatedAt;
           insertCMD.ExecuteNonQuery();
        }
     }

3 ответа

Решение

Почему бы не изменить свой SQL на:

INSERT INTO TestplanTeststep
(TeststepId,TestplanId,CreatedAt,ErrorText,ErrorScreenshot,TestState) 
VALUES 
(@TeststepId, @TestplanId,@CreatedAt,NULL,NULL,@TestState)

или просто

INSERT INTO TestplanTeststep
(TeststepId,TestplanId,CreatedAt,TestState) 
VALUES 
(@TeststepId, @TestplanId,@CreatedAt,@TestState)

... и пропустить два параметра?

Если это всегда NULL, это будет иметь тот же эффект.

В противном случае попробуйте две строки:

var binary1 = insertCMD.Parameters.Add("@ErrorScreenshot", SqlDbType.VarBinary, -1);
binary1.Value = DBNull.Value;

В противном случае в исходном операторе вставки SQL вы не определяете тип параметра, а передаете в varbinary, что приводит к ошибке.

У меня была такая же проблема при вставке DBNull.Value для Varbinary(Max) колонка. После поиска в Google я нашел решение, которое также может вам помочь:

Вам нужно установить размер -1, что означает Max длина столбца varbinary при добавлении параметра sql:

this.cmd.Parameters.Add("@Photo", SqlDbType.VarBinary, -1).Value = DBNull.Value;

Итак, в вашем случае:

insertCMD.Parameters.Add("@ErrorScreenshot", SqlDbType.VarBinary,-1).Value = DBNull.Value;

У меня была такая же проблема, и она была решена с помощью сообщения Абдулкадира МАВИ здесь .

Я использовал строку ниже вместо DBNull.Value:

      param.Value = Thumbnail is null ? System.Data.SqlTypes.SqlBinary.Null : Thumbnail;
Другие вопросы по тегам