2010-04-19 32 views
8

Mi aplicación interactúa con las bases de datos de Oracle y SQL Server utilizando una capa de acceso a datos personalizada escrita en ADO.NET usando DataReaders. En este momento estoy teniendo un problema con la conversión entre los GUID (que usamos para las claves principales) y el tipo de datos Oracle RAW. Las inserciones en el oráculo están bien (solo uso el método ToByteArray() en System.Guid). El problema es la conversión a System.Guid cuando cargo registros de la base de datos. Actualmente, estoy usando la matriz de bytes que obtengo de ADO.NET para pasar al constructor de System.Guid. Esto parece estar funcionando, pero las Guías que aparecen en la base de datos no se corresponden con las Guías que estoy generando de esta manera.¿Convertir matriz de bytes de Oracle RAW a System.Guid?

No puedo cambiar el esquema de la base de datos o la consulta (ya que se reutiliza para SQL Server). Necesito un código para convertir la matriz de bytes de Oracle en la Guid correcta.

+0

¿Tiene algún ejemplo de GUID antes de que se almacenen, y del valor cuando se almacenan? – Richard

+0

¿Está guardando el guid como una matriz de bytes en Oracle? – Peter

Respuesta

4

Resulta que el problema fue el orden de bytes que obtienes en Guid.ToByteArray() y no el propio Oracle. Si toma el Guid "11223344-5566-7788-9900-aabbccddeeff" y llama al ToByteArray(), obtendrá "44332211665588779900AABBCCDDEEFF". Si luego le devuelve ese conjunto de bytes al constructor para Guid, obtendrá el Guid original. Mi error fue tratar de consultar la base de datos Oracle por el formato Guid original (con los guiones eliminados) en lugar del resultado de la llamada ToByteArray().

Todavía no tengo idea de por qué los bytes están ordenados de esa manera, pero aparentemente no tiene nada que ver con Oracle.

+0

Esta es la razón ... http://stackoverflow.com/questions/9195551/why-does-guid-tobytearray-order-the-bytes-the-way-it-does – samneric

0

Tengo vagos recuerdos de que los GUID de Oracle se revierten efectivamente en comparación con el orden que .NET espera.

Intente invertir la matriz antes de llamar al constructor Guid.

Puede que no sea bastante tan simple como invertir, sin embargo, es posible que deba realizar un intercambio más detallado. Sugiero que cree un GUID donde cada byte sea fácil de identificar (use 0x01, 0x23, 0x45, etc.) y trabaje desde allí.

+0

Gracias por la respuesta. No estaba del todo bien porque estaba haciendo la pregunta incorrecta. Sin embargo, tu sugerencia me ayudó a encontrar la respuesta correcta. –

3

Acabo de tener este mismo problema al almacenar y leer los Guids de Oracle.

Si su aplicación necesita para almacenar y leer GUID de Oracle, utilice la función FlipEndian de este hilo:

.NET Native GUID conversion

Byte[] rawBytesFromOracle; 
Guid dotNetGuid = new Guid(rawBytesFromOracle).FlipEndian(); 

El flip sólo es necesario cuando la lectura de vuelta de Oracle.

Al escribir en Oracle, utilice Guid.ToByteArray() de forma normal.

Pasé demasiado tiempo tratando de realizar esta sencilla tarea.

Steve

Cuestiones relacionadas