Konvertieren Byte-Array von Oracle RAW zu System.Guid?

8

Meine App interagiert mit Oracle- und SQL Server-Datenbanken unter Verwendung einer benutzerdefinierten Datenzugriffsebene, die in ADO.NET mit DataReader geschrieben wird. Im Moment habe ich ein Problem mit der Konvertierung zwischen GUIDs (die wir für Primärschlüssel verwenden) und dem Oracle RAW-Datentyp. Einfügungen in Oracle sind in Ordnung (ich verwende nur die Methode ToByteArray () auf System.Guid). Das Problem besteht darin, zurück in System.Guid zu konvertieren, wenn ich Datensätze aus der Datenbank lade. Derzeit verwende ich das Byte-Array, das ich von ADO.NET erhalte, um in den Konstruktor für System.Guid zu gelangen. Dies scheint zu funktionieren, aber die Guids, die in der Datenbank erscheinen, entsprechen nicht den Guids, die ich auf diese Weise erzeuge.

Ich kann das Datenbankschema oder die Abfrage nicht ändern (da es für SQL Server wiederverwendet wird). Ich brauche Code, um das Byte-Array von Oracle in die richtige Guid zu konvertieren.

    
Cory McCarty 19.04.2010, 13:30
quelle

3 Antworten

4

Es stellt sich heraus, dass das Problem die Byte-Reihenfolge ist, die Sie in Guid.ToByteArray() erhalten, und nicht Oracle selbst. Wenn Sie die Guid " 11223344-5566-7788-9900-aabbccddeeff " verwenden und ToByteArray() darauf aufrufen, erhalten Sie " 44332211665588779900AABBCCDDEEFF ". Wenn Sie dann dieses Byte-Array wieder in den Konstruktor für Guid übergeben, erhalten Sie das ursprüngliche Guid. Mein Fehler war der Versuch, die Oracle-Datenbank nach dem ursprünglichen Guid-Format (mit entfernten Bindestrichen) anstatt nach dem Ergebnis des Aufrufs ToByteArray() abzufragen.

Ich habe immer noch keine Ahnung, warum die Bytes auf diese Weise geordnet sind, aber es hat anscheinend nichts mit Oracle zu tun.

    
Cory McCarty 23.04.2010, 16:42
quelle
3

Ich hatte gerade das gleiche Problem beim Speichern und Lesen von Guids von Oracle.

Wenn Ihre App Guids von Oracle speichern und lesen soll, verwenden Sie die Funktion FlipEndian aus diesem Thread:

.NET Native GUID-Konvertierung

%Vor%

Die Umkehrung wird nur benötigt, wenn Sie von Oracle zurücklesen.

Wenn Sie nach Oracle schreiben, verwenden Sie Guid.ToByteArray () wie gewohnt.

Ich habe zu viel Zeit damit verbracht, diese einfache Aufgabe zu erledigen.

Steve

    
samneric 06.10.2015 16:11
quelle
0

Ich habe vage Erinnerungen, dass die GUIDs von Oracle im Vergleich zu der Reihenfolge, die .NET erwartet, effektiv umgekehrt sind.

Versuchen Sie, das Array umzukehren, bevor Sie den Guid -Konstruktor aufrufen.

Es ist vielleicht nicht ganz so einfach wie Rückwärtsfahren, aber Sie müssen vielleicht detaillierteres Swapping durchführen. Ich schlage vor, dass Sie eine GUID erstellen, wo jedes Byte leicht zu identifizieren ist (verwenden Sie 0x01, 0x23, 0x45 usw.) und arbeiten Sie von dort.

    
Jon Skeet 19.04.2010 13:35
quelle

Tags und Links