2012-07-10 19 views
9

ottengo questa eccezione quando si tenta di inserire un DBNull.Value in un annullabile varbinary (max) campo:conversione implicita da tipo di dati nvarchar al varbinary (max) non è consentito

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

Quello è il mio codice:

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

So che esistono domande duplicate su SO, ma NON uso alcuna stringa come fanno gli altri.

Cosa ho sbagliato?

UPDATE:

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

Non sembra la riga di codice corretta. UniqueIdentifier non è menzionato affatto. Forse fornire anche la definizione della procedura memorizzata? – Sean

+0

Spiacente, ho copiato un'eccezione errata. Ora è corretto. – Pascal

+0

Il secondo parametro di 'AddWithValue' è il valore. Non il tipo di dati. –

risposta

6

perché non cambiare il vostro SQL:

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

o semplicemente

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

... e omettere i due parametri?

Se è sempre NULL, avrà lo stesso effetto.

In caso contrario, provare in due linee:

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

In caso contrario, nella sua dichiarazione di inserimento SQL originale, non sei che definisce il tipo di parametro, ma passando varbinary, da qui l'errore.

+0

Lo stesso errore che ottengo. Si prega di consultare il mio codice pubblicato. – Pascal

+0

ah eri più veloce appena trovato il trucco -1 hehe. Voglio impostare in modo esplicito null in questo modo altri o conosco il comportamento predefinito della tabella. – Pascal

15

Ho avuto lo stesso problema durante l'inserimento DBNull.Value per una colonna Varbinary(Max). Dopo Googling ho trovato una soluzione che può aiutare pure:

È necessario impostare dimensioni -1 che significa Max lunghezza per la colonna varbinary Quando aggiungi il parametro sql:

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

Quindi nel tuo caso :

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