4 votos

¿Alguien ha encontrado una solución al error IMemoryBlobStream.LoadFromFile ()?

Hasta donde yo soy consciente, aparecerá un mensaje de error si intenta cargar archivos de gran tamaño, utilizando la función de IMemoryBlobStream.LoadFromFile().

Alguien ha encontrado alguna solución de código para cargar un archivo en una IMemoryBlobStream?

Lo que estoy tratando de hacer es insertar un archivo en formato PDF, en un BLOB en una base de datos de Oracle, pero no lo estoy, y no desea utilizar Oracle API. Sólo estoy usando ArcOjects para este.

Mi código es:

public void LoadReport(string fileName)
{
    try
    {
        if (File.Exists(fileName))
        {
            IMemoryBlobStream2 memoryBlobStream = new MemoryBlobStreamClass();
            memoryBlobStream.LoadFromFile(fileName);

            report = memoryBlobStream;
        }
    }
    catch (Exception ex) {
                throw ex;
    }
}

ACTUALIZACIÓN

Este es el código que he puesto para finalmente obtener el archivo en la base de datos, ahora sólo tiene que comprobar leyendo el archivo de la nota - es de esperar que se debe trabajar.

fs = new System.IO.FileStream(fileName, FileMode.Open, FileAccess.Read);

byte[] bytes = new byte[fs.Length];

int chunkSize = 2 << 17;

int pos = 0;

for (pos = 0; pos < (fs.Length - chunkSize); pos += chunkSize)
{
    fs.Read(bytes, pos, chunkSize);
}
long modResult = (fs.Length % chunkSize);
fs.Read(bytes, pos,Convert.ToInt32(modResult));

IMemoryBlobStream2 memoryBlobStream = new MemoryBlobStreamClass();
memoryBlobStream.ImportFromMemory(ref bytes[0], (uint)bytes.Length);

fs.Close();

4voto

Nathan Bedford Puntos 3157

En primer lugar, cargue el archivo en un archivo regular .NETO Stream (por ejemplo, un FileStream), a continuación, convertir a IMemoryBlobStream como sigue:

byte[] bytes = new byte[stream.Length]; // stream is a .NET Stream instance
stream.Read(bytes, 0, bytes.Length);

IMemoryBlobStream memoryBlobStream = new MemoryBlobStreamClass();
memoryBlobStream.ImportFromMemory(ref bytes[0], (uint)bytes.Length);

En su situación específica en la que usted puede tomar un atajo útil de la lectura de la bytes de una manera más sencilla, llamando Archivo.ReadAllBytes(). Se abre, lee y cierra un FileStream detrás de las escenas para usted.

Cualquier otra instancia de una .NETO Stream hará el truco, por supuesto.

En cualquier caso, este enfoque es más intensivo de la memoria de IMemoryBlobStream.LoadFromFile() ya que los datos se deben residir en la memoria dos veces antes de la GC recoge la bytes de referencia.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X