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