¿Cómo inserta un archivo (PDF) en una columna varbinary SQL Server y luego lo recupera?

StackOverflow https://stackoverflow.com/questions/443635

  •  22-07-2019
  •  | 
  •  

Pregunta

Estoy buscando tomar los resultados de una ejecución de informe (un archivo PDF de Crystal Reports), serializarlo, pegarlo en un campo varbinary y luego poder deserializarlo y presentarlo de nuevo al usuario.

Por ahora tengo que simplemente usar ADO .NET (SqlClient, SqlCommand, etc.)

¿Hay alguna dificultad para esto? ¿Cuál es la sintaxis básica para lograr esto dado el hecho de que yo sabría la ruta en la máquina local donde se guardó actualmente el archivo PDF?

¿Fue útil?

Solución

EDITAR: recién visto en la documentación de MSDN que la imagen se eliminará . Mejor uso use VARBINARY (MAX). (Hola, no lo sabía).

MI ANTIGUA RESPUESTA: VARBINARY tiene un límite de 8 KB. Puede ser demasiado pequeño para almacenar archivos PDF. Será mejor que use el tipo de datos IMAGEN.

Use parámetros para insertar / seleccionar sus datos a través de SqlCommand, y puede usar SQL simple como cualquier campo ordinario.

Los datos que pasa al campo de imagen son una matriz de bytes.

Edición 2: dado que está utilizando C #, debe recuperar los datos con un DataReader. Para crear el DataReader, use el indicador SequentialAccess en el SqlCommand.ExecuteReader , para evitar que los datos se lean en la memoria demasiado pronto.

Otros consejos

Realmente no usaría un parámetro byte [] para un IDbCommand en absoluto. ¿Qué pasa si su PDF es de 100 Mb? Hasta donde sé, esto obtendría todos esos 100 Mb de su base de datos (necesitando esa cantidad de memoria en su servidor) antes de enviar el resultado al navegador solicitante. Ahora piense en obtener una cantidad de solicitudes simultáneas para diferentes PDF de aproximadamente este tamaño ... por segundo ... Eso no es muy escalable.

Para una posible solución, consulte " Blob + Stream = BlobStream " ; , un artículo que escribí para la revista .NET aquí en los Países Bajos hace un par de años. Este método utiliza comandos de SQL Server para acceder a partes de un BLOB desde un Stream clase derivada.

El artículo está en holandés, pero el código de ejemplo que lo acompaña debería ser suficiente para comenzar. Además, Peter De Jonghe parece haber escrito un artículo sobre CodeProject que se expande en mi artículo un poco, generalizándolo a más que solo columnas image en SQL Server. Este artículo está en inglés.

Espero que esto te ayude con tu problema.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top