es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

InvalidCastException: System.DBNull no se puede convertir a System.Byte[] – Archivo BLOB

Quería exportar archivos blob a mi sistema de archivos con un OracleReader. Funciona para la mayoría de ellos, pero obtengo una excepción System.DBNull con algunos.

La excepción se lanza en “byte[] byteArray = (Byte[])myReader[“DATEIBLOB”];”

¿Puedo solucionarlo con una consulta if?

Utilizando (OracleCommand cmd = new OracleCommand(oracleBlobSqlString))
{
cmd.CommandType = CommandType.Text;
cmd.Connection = oraCon;

OracleDataReader myReader = cmd.ExecuteReader();
mientras (myReader.Read())
{
    //Pfad
    string sqlPath = myReader.GetString(1);
    string sqlFilename = myReader.GetString(0);


    byte[] byteArray = (Byte[])myReader["DATEIBLOB"]; //Excepción

    utilizando (FileStream fs = new FileStream((pPath + "/" + sqlPath + "/" + sqlFilename), FileMode.CreateNew, FileAccess.Write))
    {
        fs.Write(byteArray, 0, byteArray.Length);
    }

    si (exportToken.IsCancellationRequested)
    {
        cancelToken = true;
    }
}
myReader.Close();
logFile("Dateiblobs nach " + pPath + " exportiert");

}

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, puedes resolver la excepción System.DBNull revisando si el valor de la columna “DATEIBLOB” es DBNull.Value antes de intentar leerlo como una matriz de bytes. Puedes utilizar el siguiente fragmento de código para lograr esto:

    while (myReader.Read())
    {
       // Ruta
       string sqlPath = myReader.GetString(1);
       string sqlFilename = myReader.GetString(0);
    
       if (myReader["DATEIBLOB"] != DBNull.Value)
       {
          byte[] byteArray = (Byte[])myReader["DATEIBLOB"];
    
          using (FileStream fs = new FileStream((pPath + "/" + sqlPath + "/" + sqlFilename), FileMode.CreateNew, FileAccess.Write))
          {
              fs.Write(byteArray, 0, byteArray.Length);
          }
       }
    
       if (exportToken.IsCancellationRequested)
       {
          cancelToken = true;
       }
    }
    

    Este fragmento de código primero revisa si el valor de “DATEIBLOB” no es DBNull.Value antes de intentar leerlo como una matriz de bytes. Si es DBNull.Value, el código dentro del bloque if se saltará y el ciclo continuará con la siguiente iteración. Si “DATEIBLOB” no es DBNull.Value, entonces se leerá la matriz de bytes y se escribirá en el sistema de archivos, como antes.

Comments are closed.