2011-04-28 15 views
12

¿Qué tipo de SqlDbType se asigna a varBinary (max)? SqlDbType.VarBinary dice que está limitado a 8K. La documentación de SQL Server dice que varbinary (max) puede almacenar aprrox. 2GB. Pero SqlDbType.VarBinary dice que está limitado a 8K.
¿Qué tipo de SqlDbType se asigna a varBinary (max)?

Respuesta

21

SqlDbType.VarBinary con la longitud -1 es el equivalente a varbinary (max), al menos en teoría. Pero el problema es un poco más complejo, ya que también hay un tipo (no un valor enum), es decir, SqlTypes.SqlBytes que se puede usar. Y existe SqlTypes.SqlFileStream que se puede usar también para los tipos VARBINARY(MAX), cuando tienen el atributo FILESTREAM.

Pero el problema es que ninguna de estas enumeraciones o tipos cubre el problema real al trabajar con las columnas VARBINARY(MAX) en ADO.Net: consumo de memoria. Todos estos tipos, cuando se usen 'out-of-the-box', crearán copias del valor asignado como una única matriz en la memoria, que en el mejor de los casos no es eficiente, pero a medida que el contenido se hace más grande se vuelve imposible de usar debido a fallas de asignación . Tengo un par de artículos que muestran la forma correcta de manejar VARBINARY(MAX) valores en ADO.Net utilizando la semántica de transmisión que evitan la creación de copias en memoria de todo el contenido:

+1

He usado -1 y funciona bien – Abacus

+0

Realmente extraño que lo anterior no funcionó para mí. Tuve que escribir: dtProducts.Columns.Add (new DataColumn ("Cover", typeof (byte [])) {AllowDBNull = true}); fíjate en el byte [] ... esto es lo que funcionó para mí. – Johan

5

Prueba esto:

SqlParameter blobParam = new SqlParameter("@blob", SqlDbType.VarBinary, buffer.Length); 
blobParam.Value = buffer; 
cmd.Parameters.Add(blobParam); 

ver si funciona

+1

Gracias por su respuesta, lo he resuelto. – jams

+1

¿Cuál fue la solución, solo por curiosidad? – dmg

+1

¿Cuál es el tipo de 'buffer'? –

Cuestiones relacionadas