web-dev-qa-db-fra.com

La conversion implicite du type de données nvarchar en varbinary (max) n'est pas autorisée

J'obtiens cette exception lorsque j'essaie d'insérer un DBNull.Value dans un champ nullable varbinary (max):

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

C'est mon code:

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

Je sais qu'il existe des questions en double sur SO, mais je n'utilise aucune chaîne comme les autres.

Qu'est-ce que j'ai tort?

METTRE À JOUR:

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();
        }
     }
14
Pascal

Pourquoi ne pas changer votre SQL en:

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

ou juste

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

... et omettez les deux paramètres?

Si c'est toujours NULL, cela aura le même effet.

Sinon, essayez-le en deux lignes:

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

Sinon, dans votre instruction d'insertion SQL d'origine, vous ne définissez pas le type de paramètre mais passez en varbinary, d'où l'erreur.

6
Sean

J'ai eu le même problème lors de l'insertion DBNull.Value Pour une colonne Varbinary(Max). Après Google, j'ai trouvé une solution qui pourrait également vous aider:

Vous devez définir la taille - 1 ce qui signifie Max longueur pour la colonne varbinary lors de l'ajout de votre paramètre sql:

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

Donc dans votre cas:

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