2012-07-10 17 views
9

me sale esta excepción cuando trato de insertar un DBNull.Value en un campo anulable varbinary (max):conversión implícita del tipo de datos nvarchar a varbinary (max) no está permitido

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

Ésta es mi código:

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

sé que existen preguntas duplicadas en el SO, pero yo no uso ninguna cadena como hacen los demás.

¿Qué es lo que me pasa?

ACTUALIZACIÓN:

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

No se ve como la línea de código correcta. UniqueIdentifier no se menciona en absoluto. Tal vez proporcionar la definición de procedimiento almacenado también? – Sean

+0

Lo siento, copié la excepción incorrecta. Ahora está corregido. – Pascal

+0

El segundo parámetro de 'AddWithValue' es el valor. No es el tipo de datos. –

Respuesta

6

por qué no cambiar su SQL a:

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

o simplemente

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

... y omitir los dos parámetros?

Si siempre es NULO, tendrá el mismo efecto.

De lo contrario, probarlo en dos líneas:

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

De lo contrario, en su sentencia de inserción SQL original, no estás definiendo el tipo de parámetro, sino que pasa en varbinary, de ahí el error.

+0

Mismo error que recibo. Por favor mira mi código publicado – Pascal

+0

ah fuiste más rápido acaba de encontrar el -1 truco jeje. Quiero establecer explícitamente null de esta manera otros o sé sobre el comportamiento predeterminado de la tabla. – Pascal

15

Tuve el mismo problema durante la inserción DBNull.Value para una columna Varbinary(Max). Después de buscar en Google he encontrado una solución que puede ayudar también:

Es necesario ajustar el tamaño -1 que significa Max longitud de la columna varbinary al agregar el parámetro de SQL:

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

Así, en su caso :

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