• Lunes 18 de Noviembre de 2024, 03:40

Autor Tema:  obtener campo Lob(Oracle)  (Leído 4687 veces)

lugarda

  • Miembro activo
  • **
  • Mensajes: 52
  • Nacionalidad: co
    • Ver Perfil
obtener campo Lob(Oracle)
« en: Martes 31 de Mayo de 2011, 17:11 »
0
Hola a todos, tengo una tabla en Oracle10g donde guardo las especificaciones de un documento y este campo es de tipo BLOB.
Estoy haciendo un programa en C# donde estoy intentando obtener estas especificaciones a traves de un OracleDataReader, pero no logro encontrar método que me permita hacerlo, lo intenté con GetString pero obviamente me saca error. Si alguien me puede dar una pista , se los agradeceria mucho.
Adjunto el pedazo de código que tengo.
Monica.

Código: C#
  1.  
  2.  internal long obtenerPurc_ReqLnBinary(string codigoRequisicion, int lineaNo)
  3.         {
  4.             long especificaciones;
  5.             try
  6.             {
  7.                 using (OracleCommand consulta = this.conexionOracle.CreateCommand())
  8.                 {
  9.                     consulta.CommandText = (@" select bits  
  10.                                                from purc_req_ln_binary
  11.                                                where purc_req_id=:codigoRequisicion and purc_req_line_no=:lineaNo");
  12.                     consulta.Parameters.Add(new OracleParameter(":codigoRequisicion", OracleType.VarChar)).Value = codigoRequisicion;
  13.                     consulta.Parameters.Add(new OracleParameter(":lineaNo", OracleType.Int32)).Value = lineaNo;
  14.                     using (OracleDataReader cursor = consulta.ExecuteReader())
  15.                     {
  16.                         while (cursor.Read())
  17.                         {
  18.                             especificaciones= cursor.IsDBNull(0) ? null : cursor.GetString(0);   }
  19.                     }
  20.                 }
  21.             }
  22.             catch (Exception e)
  23.             {
  24.                 ExcepcionLafrancol ex = new ExcepcionLafrancol(e.Message);
  25.                 ex.TipoExcepcion = e.GetType().ToString();
  26.                 ex.Source = "Purc_Req_Ln_BinaryAD - [obtenerPurc_ReqLnBinary()]";
  27.                 ex.Anotaciones = "Error en consulta de requisiciones";
  28.                 throw ex;
  29.             }
  30.             return especificaciones;
  31.  
  32.  

gabio2

  • Miembro MUY activo
  • ***
  • Mensajes: 402
  • Nacionalidad: mx
    • Ver Perfil
Re: obtener campo Lob(Oracle)
« Respuesta #1 en: Martes 31 de Mayo de 2011, 19:32 »
0
Mira, te paso la definición de un campo de tipo BLOB.

Blob. Se utiliza un campo Blob (Binary Large Object) para almacenar documentos u objetos en formato binario. Por ejemplo, podemos almacenar documentos creados por otras aplicaciones o guardar imágenes. El tamaño de un campo Blob es de 2 Gigabytes. El contenido de un campo Blob no se visualiza en pantalla.

Información obtenida de: http://www.faq-mac.com/cursos/4D/pag11.htm

Por lo tanto como dice "el contenido de un campo blob no se visualiza en pantalla", para eso tendrias tú que convertir ese documento y/o archivo en lo que tú desees. Para tu base de datos solo son 0 y 1, tú le aplicas ese formato.

Para hacer lo anterior se hace usando el FileStream.

No sé si con eso aclaro un poco más tu duda, o si te surgieron más.. jajajaja.. un saludo.. cualquier cosa pregunta.. :)
@gabio87

lugarda

  • Miembro activo
  • **
  • Mensajes: 52
  • Nacionalidad: co
    • Ver Perfil
Re: obtener campo Lob(Oracle)
« Respuesta #2 en: Martes 31 de Mayo de 2011, 21:36 »
0
Muchas gracias por responder tan pronto. Mientras recibia respuesta del foro , seguí investigando y encontré un artículo donde encontré algo similiar a lo que necesito pero en mi caso lo que hay almacenado en este campo es texto y para ser sincera no se como convertir lo que esta almacenado en este campo , de tal manera que lo pueda ver por pantalla.
Si me puedes dar una idea de como usar el FileStream que me sugieres , te lo agradezco mucho. Por favor no creas que es pereza de investigar, solo es que mañana debo entregar el programa y aun me falta mucho.
Gracias.

Código: C#
  1.  
  2. if (oraImgReader.GetValue(2).ToString() != "")
  3. {
  4.                         // Fetch the BLOB data through OracleDataReader using OracleBlob type
  5.                         OracleBlob blob = oraImgReader.GetOracleBlob(2);
  6.                         // Create a byte array of the size of the Blob obtained
  7.                         Byte[] byteArr =  new Byte[blob.Length];
  8.                         // Read blob data into byte array
  9.                         int i = blob.Read(byteArr,0,System.Convert.ToInt32(blob.Length));
  10.                         // Get the primitive byte data into in-memory data stream
  11.                         MemoryStream memStream = new MemoryStream(byteArr);
  12.                         // Attach the in-memory data stream to the PictureBox
  13.                         picEmpPhoto.Image = Image.FromStream(memStream);
  14.                         // Fit the image to the PictureBox size
  15.                         picEmpPhoto.SizeMode = PictureBoxSizeMode.StretchImage;
  16.  }
  17.  
  18.  

gabio2

  • Miembro MUY activo
  • ***
  • Mensajes: 402
  • Nacionalidad: mx
    • Ver Perfil
Re: obtener campo Lob(Oracle)
« Respuesta #3 en: Martes 31 de Mayo de 2011, 22:23 »
0
Tu campo de TIPO BLOB que contiene?.. LETRAS y/o Números?... o Archivos (.txt/.doc/.pdf/etc) ?....
@gabio87

lugarda

  • Miembro activo
  • **
  • Mensajes: 52
  • Nacionalidad: co
    • Ver Perfil
Re: obtener campo Lob(Oracle)
« Respuesta #4 en: Martes 31 de Mayo de 2011, 22:24 »
0
Hola tiene letras y/o numeros.

gabio2

  • Miembro MUY activo
  • ***
  • Mensajes: 402
  • Nacionalidad: mx
    • Ver Perfil
Re: obtener campo Lob(Oracle)
« Respuesta #5 en: Martes 31 de Mayo de 2011, 22:52 »
0
Entonces.. basta con utilizar esto:

Código: C#
  1.  
  2. string MiCadena = System.Text.Encoding.UTF8.GetString(VariableTipoByte);
  3.  
  4.  


Saludos! :)
@gabio87

lugarda

  • Miembro activo
  • **
  • Mensajes: 52
  • Nacionalidad: co
    • Ver Perfil
Re: obtener campo Lob(Oracle)
« Respuesta #6 en: Miércoles 1 de Junio de 2011, 18:44 »
0
Gracias por tu respuesta, lo probe y  nome funcionó.
Asi que busque la forma de traer el campo ya convertido desde el select hacia mi aplicacion. Adjunto el código:
Código: C#
  1.  
  2. consulta.CommandText = (@" select purc_req_id,purc_req_line_no,
  3.                                                      UTL_RAW.CAST_TO_VARCHAR2(DBMS_LOB.SUBSTR(bits, 4000,1))
  4.                                               from purc_req_ln_binary
  5.                                               where purc_req_id=:codigoRequisicion ");
  6.  
  7.  

Sin embargo de verdad agradezco tu ayuda.