2010-04-19 25 views
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.Bytearray von Oracle RAW in System.Guid konvertieren?

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

+0

Haben Sie Beispiele für GUIDs, bevor sie gespeichert werden, und den Wert, wenn sie gespeichert werden? – Richard

+0

Speichern Sie die GUID als Byte-Array in Oracle? – Peter

Antwort

4

Es stellt sich heraus, dass das Problem die Byte-Reihenfolge war, die Sie in Guid.ToByteArray() und nicht Oracle selbst erhalten. Wenn Sie die Guid "11223344-5566-7788-9900-aabbccddeeff" nehmen 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 mit dem ursprünglichen Guid-Format (mit den gestrichelten Bindestrichen) anstatt mit 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.

+0

Deshalb ..... http://stackoverflow.com/questions/9195551/why-does-guid-tobytearray-order-the-bytes-the-way-it-does – samneric

0

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

Versuchen Sie, das Array vor dem Aufruf des Guid-Konstruktors umzukehren.

Es kann nicht ganz so einfach wie Umkehrung jedoch sein - Sie müssen möglicherweise detailliertere Swapping tun. Ich schlage vor, dass Sie eine GUID erstellen, wo jedes Byte leicht zu identifizieren ist (verwenden Sie 0x01, 0x23, 0x45 etc) und arbeiten Sie von dort aus.

+0

Danke für die Antwort. Es war nicht ganz richtig, weil ich die falsche Frage gestellt hatte. Dein Vorschlag hat mich jedoch zur richtigen Antwort gebracht. –

3

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

Wenn Ihre App benötigt Guids von Oracle, verwenden Sie die FlipEndian Funktion von diesem Thread zu speichern und zu lesen:

.NET Native GUID conversion

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

Die Flip ist nur erforderlich, wenn der Artikel wieder von Oracle zu lesen.

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

Ich verbrachte zu viel Zeit damit, diese einfache Aufgabe zu erledigen.

Steve